Подтвердить что ты не робот

Различия между 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 не работает?

4b9b3361

Ответ 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, где хранятся мультимедийные файлы, все загруженные файлы. Пример: изображения, файлы