Различия между STATICFILES_DIR, STATIC_ROOT и MEDIA_ROOT
В чем разница между этими тремя статическими URL?
Я не уверен, что я прав, я использую MEDIA_ROOT
для хранения моих загруженных фотографий (через models.ImageField()
)
Однако я создал JS script для моего администратора и в admin.py
. Я определил носитель, как показано ниже:
....
class Media:
js = ('/admin/custom.js', )
и my settings.py
:
....
STATIC_ROOT = "/home/user/project/django1/top/listing/static"
и я добавил custom.js
в STATIC_ROOT/admin/custom.js
, но он не работает. Выброс 404 не найден.
И затем я меняю STATIC_ROOT
на STATICFILES_DIRS
, и он работает!!
....
STATICFILES_DIRS = "/home/user/project/django1/top/listing/static"
Итак, я не понимаю, что здесь происходит. На самом деле, я просто не понимаю, в чем разница между STATIC_ROOT
и STATICFILES_DIRS
.
В настоящее время я тестирую Django на своей машине через virtualenv, пока не развернуто, это причина, по которой STATIC_ROOT
не работает?
Ответы
Ответ 1
Вы можете найти определение для каждого из этих параметров в документации. Вот краткое определение (мое) и цитата документа, для каждого:
-
MEDIA_ROOT
- это папка, в которую будут отправляться все файлы, загруженные с помощью FileField
.
Абсолютный путь файловой системы к каталогу, в котором будут храниться загруженные пользователем файлы.
-
STATIC_ROOT
- это папка, в которой будут сохраняться все статические файлы после manage.py collectstatic
Абсолютный путь к каталогу, где collectstatic
будет собирать статические файлы для развертывания.
Если приложение staticfiles
contrib включено (по умолчанию), команда управления collectstatic
будет собирать статические файлы в этот каталог. Подробнее об использовании см. В руководстве по управлению статическими файлами.
-
STATICFILES_DIRS
- это список файлов, в которых Django будет искать дополнительные статические файлы, в дополнение к каждой папке static
каждого установленного приложения.
Этот параметр определяет дополнительные местоположения, в которых приложение staticfiles будет проходить, если включен FileSystemFinder
finder, например. если вы используете команду управления collectstatic
или findstatic
или используете представление статического представления файлов.
В настройках вы должны:
MEDIA_ROOT = os.path.join(BASE_DIR, "media/")
STATIC_ROOT = os.path.join(BASE_DIR, "static/")
STATICFILES_DIRS = ("/home/user/project/django1/top/listing/static", ) # Make a tuple of strings instead of a string
... где BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
, как определено в шаблоне Django settings.py
по умолчанию.
Ответ 2
Разработка
STATIC_ROOT
бесполезен во время разработки, он требуется только для развертывания.
В процессе разработки STATIC_ROOT
ничего не делает. Вам даже не нужно его устанавливать. Django ищет статические файлы внутри каждого каталога приложений (myProject/appName/static
) и обслуживает их автоматически.
Это волшебство, выполняемое manage.py runserver
, когда DEBUG=True
.
Развертывание
Когда ваш проект идет вживую, все меняется. Скорее всего, вы будете обслуживать динамический контент, используя Django, а статические файлы будут обслуживаться Nginx. Зачем? Поскольку Nginx невероятно эффективен и уменьшит рабочую нагрузку с Django.
Здесь STATIC_ROOT
становится удобным, так как Nginx ничего не знает о вашем проекте django и не знает, где найти статические файлы.
Итак, вы установите STATIC_ROOT = '/some/folder/'
и скажите Nginx искать статические файлы в /some/folder/
. Затем вы запустите manage.py collectstatic
, и Django скопирует статические файлы из всех приложений, которые у вас есть, /some/folder/
.
Дополнительные каталоги для статических файлов
STATICFILES_DIRS
используется для включения дополнительных каталогов для collectstatic
для поиска. Например, по умолчанию Django не распознает /myProject/static/
. Поэтому вы можете включить его сами.
Пример
STATIC_URL = '/static/'
if not DEBUG:
STATIC_ROOT = '/home/django/www-data/site.com/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static/'),
]
Ответ 3
Разница между STATICFILES_DIRS
и STATIC_ROOT
STATICFILES_DIRS
может содержать другие каталоги (не обязательно каталоги приложений) со статическими файлами, и эти статические файлы будут собраны в ваш STATIC_ROOT при запуске collectstatic
. Эти статические файлы затем будут обслуживаться вашим веб-сервером, и они будут отправлены из вашего STATIC_ROOT.
Если у вас есть файлы, находящиеся в вашем STATIC_ROOT, которые вы хотите обслуживать, вам нужно переместить их в другой каталог и поместить этот другой каталог в STATICFILES_DIRS
. Ваш каталог STATIC_ROOT
должен быть пустым, и все статические файлы должны быть собраны в этот каталог.
MEDIA_ROOT
, где хранятся мультимедийные файлы, все загруженные файлы.
Пример: изображения, файлы