MEDIA_ROOT против MEDIA_URL (Django)

Я прочитал документацию о MEDIA_ROOT и MEDIA_URL тогда я смог понять их немного, но не сильно.

MEDIA_ROOT:

MEDIA_URL:

Я часто вижу их, как показано ниже:

# "settings.py"

MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'

Итак, что такое "MEDIA_ROOT" и "MEDIA_URL"?

Сначала я объясняю, что такое "MEDIA_ROOT", затем "MEDIA_URL".

<MEDIA_ROOT>

"MEDIA_ROOT" устанавливает абсолютный путь к директории, где хранятся загруженные файлы и установка "MEDIA_ROOT" никогда не влияет на URL.

Например, у нас есть проект django:

enter image description here

Затем, мы устанавливаем "os.path.join(BASE_DIR, 'media')", который является "C:\Users\kai\django-project\media" в Windows в моем случае на "MEDIA_ROOT":

# "core/settings.py"

MEDIA_ROOT = os.path.join(BASE_DIR, 'media') # Here
MEDIA_URL = '/media/'

И установите код ниже в "urls.py":

# "core/urls.py"

if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

И установите модель "Image" как показано ниже:

# "myapp/models.py"

class Image(models.Model):
    image = models.ImageField()

    def __str__(self):
        return str(self.image)

И установите код ниже в "admin.py":

# "myapp/admin.py"

from .models import Image

admin.site.register(Image)

Затем загрузите файл "orange.jpg" :

enter image description here

Затем, папка "media" создается на том же уровне, что и "db.sqlite3" и "manage. py", которая находится в корневом каталоге проекта django, а загруженный файл "orange.jpg" хранится в папке "media" , как показано ниже:

enter image description here

Затем загрузите больше файлов:

enter image description here

Кроме того, мы можем отобразить файл "orange.jpg", нажав на "orange.jpg" на странице "Изменить изображение" файла , как показано ниже:

enter image description here

Затем, отобразится файл "orange.jpg", как показано ниже:

enter image description here

Будьте осторожны, если вы удалите приведенный ниже код из "urls.py":

# "core/urls.py"

if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Затем, файл "orange.jpg" не отображается. Вместо этого возникает ошибка, как показано ниже:

enter image description here

Далее, вы можете хранить загруженные файлы в большем количестве подкаталогов и я объясняю 2 способа сделать это, и первый способ рекомендуется, потому что он гибкий, а второй способ не рекомендуется, потому что он совсем не гибкий.

Первый способ хранения загруженных файлов в большем количестве подкаталогов заключается в следующем сначала установите "os.path.join(BASE_DIR, 'media')" в "MEDIA_ROOT" как показано ниже:

# "core/settings.py"

MEDIA_ROOT = os.path.join(BASE_DIR, 'media') # Here
MEDIA_URL = '/media/'

И, добавьте "upload_to='images/fruits'" к "models.ImageField()" как показано ниже:

# "myapp/models.py"

from django.db import models  

class Image(models.Model):    # Here
    image = models.ImageField(upload_to='images/fruits')

    def __str__(self):
        return str(self.image)

Затем, загруженные файлы сохраняются в "C:\Users\kai\django-project\media\images\fruits" в Windows в моем случае как показано ниже:

enter image description here

Второй способ хранения загруженных файлов в большем количестве подкаталогов заключается в том, чтобы сначала установить 'media/images/fruits' в качестве второго аргумента "os.path.join()" как показано ниже:

# "core/settings.py"
                                    # Here
MEDIA_ROOT = os.path.join(BASE_DIR, 'media/images/fruits')
MEDIA_URL = '/media/'

И установите без аргументов в "models.ImageField()" как показано ниже:

# "myapp/models.py"

from django.db import models  

class Image(models.Model): 
    image = models.ImageField() # Here

    def __str__(self):
        return str(self.image)

Затем, загруженные файлы сохраняются в "C:\Users\kai\django-project\media\images\fruits" в Windows в моем случае как показано ниже, но как я уже говорил, первый способ рекомендуется, потому что он гибкий, в то время как второй способ совсем не гибкий:

enter image description here

Кроме того, если мы не установим "MEDIA_ROOT", как показано ниже:

# "core/settings.py"

# MEDIA_ROOT = os.path.join(BASE_DIR, 'media') # Here
MEDIA_URL = '/media/'

Или установите пустую строку во второй аргумент "os.path.join()" как показано ниже:

# "core/settings.py"
                                  
MEDIA_ROOT = os.path.join(BASE_DIR, '') # Here
MEDIA_URL = '/media/'

Или не устанавливайте второй аргумент "os.path.join()" как показано ниже:

# "core/settings.py"

MEDIA_ROOT = os.path.join(BASE_DIR) # Here
MEDIA_URL = '/media/'

И установите без аргументов в "models.ImageField()" как показано ниже:

# "myapp/models.py"

from django.db import models  

class Image(models.Model): 
    image = models.ImageField() # Here

    def __str__(self):
        return str(self.image)

Затем, загруженные файлы хранятся на том же уровне, что и "db.sqlite3" и "manage.py", который находится прямо под корневым каталогом проекта django как показано ниже:

enter image description here

Кроме того, после загрузки файлов, если мы изменим "MEDIA_ROOT", мы не сможем отобразить загруженные файлы, в то время как мы все еще можем отображать загруженные файлы, даже если мы изменим "models.ImageField()".

Например, мы устанавливаем "os.path.join(BASE_DIR, 'media')" в "MEDIA_ROOT":

# "core/settings.py"

MEDIA_ROOT = os.path.join(BASE_DIR, 'media') # Here
MEDIA_URL = '/media/'

И, установите "upload_to='images/fruits'" в "models.ImageField()" как показано ниже:

# "myapp/models.py"

from django.db import models  

class Image(models.Model):    # Here
    image = models.ImageField(upload_to='images/fruits')

    def __str__(self):
        return str(self.image)

Затем загрузите файл "orange.jpg" :

enter image description here

Затем нажмите на "images/fruits/orange.jpg" на "Change image" странице файла как показано ниже:

enter image description here

Затем, отобразится файл "orange.jpg", как показано ниже:

enter image description here

Теперь изменим "MEDIA_ROOT" с "os.path.join(BASE_DIR, 'media')" на "os.path.join(BASE_DIR, 'hello/world')":

# "core/settings.py"

MEDIA_ROOT = os.path.join(BASE_DIR, 'hello/world') # Here
MEDIA_URL = '/media/'

Затем снова нажмите на "images/fruits/orange.jpg" на "Change image" странице файла как показано ниже:

enter image description here

Затем, файл "orange.jpg" не отображается. Вместо этого возникает ошибка, как показано ниже:

enter image description here

<<<Как я уже говорил, даже если мы изменим

"models.ImageField()" после загрузки файлов, мы все равно сможем отобразить загруженные файлы. Итак, теперь мы изменим обратно "MEDIA_ROOT" с "os.path.join(BASE_DIR, 'hello/world')" на "os.path.join(BASE_DIR, 'media')":

# "core/settings.py"

MEDIA_ROOT = os.path.join(BASE_DIR, 'media') # Here
MEDIA_URL = '/media/'

И, измените "models.ImageField(upload_to='images/fruits')" на "models.ImageField(upload_to='hello/world')":

# "myapp/models.py"

from django.db import models  

class Image(models.Model):    # Here
    image = models.ImageField(upload_to='hello/world')

    def __str__(self):
        return str(self.image)

Затем снова нажмите на "images/fruits/orange.jpg" на "Change image" странице файла как показано ниже:

enter image description here

Затем, отобразится файл "orange.jpg", как показано ниже:

enter image description here

<MEDIA_URL>

Далее я расскажу о "MEDIA_URL" .

"MEDIA_URL" задает только директорию (среднюю) часть URL между хостовой частью URL и файловой частью URL, как показано ниже, и установка "MEDIA_URL" никогда не влияет на абсолютный путь к директории, где хранятся загруженные файлы:

             Host        Directory      File
               |             |           |
        <-------------> <----------> <-------->      
https://www.example.com/media/images/orange.jpg

Например, мы устанавливаем '/media/' в "MEDIA_URL":

# "core/settings.py"

MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/' # Here

И установите без аргументов в "models.ImageField()" как показано ниже:

# "myapp/models.py"

from django.db import models  

class Image(models.Model): 
    image = models.ImageField() # Here

    def __str__(self):
        return str(self.image)

Затем загрузите файл "orange.jpg" :

enter image description here

Затем перейдите на страницу "Изменить изображение" файла и нажмите на "orange.jpg" :

enter image description here

Затем, отобразится URL-адрес файла, как показано ниже:

enter image description here

Как видите, часть каталога "media" установлена между частью хоста "localhost:8000" и частью файла "orange.jpg"

            Host    Directly   File
              |         |       |
       <------------> <---> <-------->      
http://localhost:8000/media/orange.jpg

А вот этот URL ниже в данном случае "www.example.com" с "https":

             Host     Directly   File
               |          |       |
        <-------------> <---> <-------->      
https://www.example.com/media/orange.jpg

И мы можем изменить часть каталога в URL даже после загрузки файлов.

Итак, просто измените "MEDIA_URL" с '/media/' на '/images/fruits/' как показано ниже:

# "core/settings.py"

MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/images/fruits/' # Here

Затем нажмите на "orange.jpg" снова:

enter image description here

Затем, часть каталога "media" изменяется на "image/fruits" как показано ниже:

enter image description here

Кроме того, мы можем установить часть каталога в URL с помощью комбинации "MEDIA_URL" и "models.ImageField()". В этом случае мы можем изменить только часть каталога, заданную "MEDIA_URL" после загрузки файлов, в то время как мы не можем изменить часть каталога, заданную "models.ImageField()" после загрузки файлов:

Например, мы устанавливаем '/media/' в "MEDIA_URL", как показано ниже:

# "core/settings.py"

MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/' # Here

И добавьте "upload_to='images/fruits'" к "models.ImageField()" как показано ниже:

# "myapp/models.py"

from django.db import models  

class Image(models.Model):    # Here
    image = models.ImageField(upload_to='images/fruits')

    def __str__(self):
        return str(self.image)

Затем загрузите файл "orange.jpg" :

enter image description here

Затем перейдите на страницу "Изменить изображение" файла и нажмите на "images/fruits/orange.jpg":

enter image description here

Затем, отобразится URL-адрес файла, как показано ниже:

enter image description here

Затем, часть каталога:

media/images/fruits

Теперь изменим "MEDIA_URL" с '/media/' на '/hello/world/':

# "core/settings.py"

MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/hello/world/' # Here

И, измените "models.ImageField(upload_to='images/fruits')" на "models.ImageField(upload_to='hey/earth')":

# "myapp/models.py"

from django.db import models  

class Image(models.Model):              # Here
    image = models.ImageField(upload_to='hey/earth')

    def __str__(self):
        return str(self.image)

Затем нажмите на "images/fruits/orange.jpg" снова:

enter image description here

Затем, отобразится URL-адрес файла, как показано ниже:

enter image description here

Тогда мы могли бы изменить часть каталога 'media' на 'hello/world', заданную "MEDIA_URL" после загрузки файла "orange. jpg", в то время как мы не смогли изменить часть каталога 'images/fruits' на 'hey/earth', заданную "models.ImageField()" после загрузки файла "orange.jpg":

hello/world/images/fruits

Кроме того, если мы не установим "MEDIA_URL" , как показано ниже:

# "core/settings.py"

MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
# MEDIA_URL = '/media/' # Here

Или установите пустую строку в "MEDIA_URL" как показано ниже:

# "core/settings.py"
                                  
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '' # Here

Или установите одну или более косых черт в "MEDIA_URL" , как показано ниже:

# "core/settings.py"

MEDIA_ROOT = os.path.join(BASE_DIR)
MEDIA_URL = '/////' # Here

И установите без аргументов в "models.ImageField()" как показано ниже:

# "myapp/models.py"

from django.db import models  

class Image(models.Model): 
    image = models.ImageField() # Here

    def __str__(self):
        return str(self.image)

Затем, между частью хоста "localhost:8000" и частью файла "orange.jpg" как показано ниже, устанавливается

enter image description here

http://localhost:8000/orange.jpg
Вернуться на верх