MEDIA_ROOT против MEDIA_URL (Django)
Я прочитал документацию о MEDIA_ROOT и MEDIA_URL тогда я смог понять их немного, но не сильно.
MEDIA_ROOT:
- Абсолютный путь файловой системы к директории, в которой будут храниться загруженные пользователем файлы.
MEDIA_URL:
- URL, который обрабатывает медиа, обслуживаемое из MEDIA_ROOT, используемый для управления сохраненными файлами. Он должен заканчиваться косой чертой, если задано непустое значение. Вам нужно будет настроить эти файлы для обслуживания как в среде разработки, так и в среде производства.
Я часто вижу их, как показано ниже:
# "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:
Затем, мы устанавливаем "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" :
Затем, папка "media" создается на том же уровне, что и "db.sqlite3" и "manage. py", которая находится в корневом каталоге проекта django, а загруженный файл "orange.jpg" хранится в папке "media" , как показано ниже:
Затем загрузите больше файлов:
Кроме того, мы можем отобразить файл "orange.jpg", нажав на "orange.jpg" на странице "Изменить изображение" файла , как показано ниже:
Затем, отобразится файл "orange.jpg", как показано ниже:
Будьте осторожны, если вы удалите приведенный ниже код из "urls.py":
# "core/urls.py"
if settings.DEBUG:
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
Затем, файл "orange.jpg" не отображается. Вместо этого возникает ошибка, как показано ниже:
Далее, вы можете хранить загруженные файлы в большем количестве подкаталогов и я объясняю 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 в моем случае как показано ниже:
Второй способ хранения загруженных файлов в большем количестве подкаталогов заключается в том, чтобы сначала установить '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 в моем случае как показано ниже, но как я уже говорил, первый способ рекомендуется, потому что он гибкий, в то время как второй способ совсем не гибкий:
Кроме того, если мы не установим "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 как показано ниже:
Кроме того, после загрузки файлов, если мы изменим "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" :
Затем нажмите на "images/fruits/orange.jpg" на "Change image" странице файла как показано ниже:
Затем, отобразится файл "orange.jpg", как показано ниже:
Теперь изменим "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" странице файла как показано ниже:
Затем, файл "orange.jpg" не отображается. Вместо этого возникает ошибка, как показано ниже:
<<<Как я уже говорил, даже если мы изменим"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" странице файла как показано ниже:
Затем, отобразится файл "orange.jpg", как показано ниже:
<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" :
Затем перейдите на страницу "Изменить изображение" файла и нажмите на "orange.jpg" :
Затем, отобразится URL-адрес файла, как показано ниже:
Как видите, часть каталога "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" снова:
Затем, часть каталога "media" изменяется на "image/fruits" как показано ниже:
Кроме того, мы можем установить часть каталога в 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" :
Затем перейдите на страницу "Изменить изображение" файла и нажмите на "images/fruits/orange.jpg":
Затем, отобразится URL-адрес файла, как показано ниже:
Затем, часть каталога:
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" снова:
Затем, отобразится URL-адрес файла, как показано ниже:
Тогда мы могли бы изменить часть каталога '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" как показано ниже, устанавливается
http://localhost:8000/orange.jpg