В чем смысл collectstatic в Django?

87

Это наверное глупый вопрос, но он просто не щелкает в моей голове.

В Django принято помещать все ваши статические файлы (например, css, js), относящиеся к вашему приложению, в папку с именем static . Итак, структура будет выглядеть так:

mysite/
    manage.py
    mysite/ --> (settings.py, etc)
    myapp/ --> (models.py, views.py, etc)
        static/

У mysite/settings.pyменя есть:

STATIC_ROOT = 'staticfiles'

Итак, когда я запускаю команду:

python manage.py collectstatic   

Он создает папку с именем staticfilesна корневом уровне (в том же каталоге, что и myapp/)

какой в ​​этом смысл? Разве это не просто создание копии всех моих статических файлов?

Крис Танг
источник

Ответы:

70

Собирайте статические файлы из нескольких приложений по одному пути

Ну, один Django проект может использовать несколько приложений , так что пока у вас есть только один myapp, это может быть на самом деле myapp1, myapp2и т.д.

Копируя их изнутри отдельных приложений в одну папку, вы можете направить свой интерфейсный веб-сервер (например, nginx) в эту единственную папку STATIC_ROOTи обслуживать статические файлы из одного места, вместо того, чтобы настраивать свой веб-сервер для обслуживания статических файлов из нескольких путей. .

Постоянные URL-адреса с ManifestStaticFilesStorage

Замечание о добавлении хэша MD5 к имени файла для управления версиями: он не является частью поведения по умолчанию collectstatic, как по settings.STATICFILES_STORAGEумолчанию StaticFilesStorage(который этого не делает)

Хеш MD5 сработает, например, если вы установите его для использования ManifestStaticFilesStorage, которое рекламирует это поведение.

Цель этого хранилища - продолжать обслуживать старые файлы в случае, если некоторые страницы все еще ссылаются на эти файлы, например, потому что они кэшированы вами или сторонним прокси-сервером. Кроме того, это очень полезно, если вы хотите применить заголовки Expires из далекого будущего к развернутым файлам, чтобы ускорить время загрузки для последующих посещений страницы.

Баккал
источник
3
вы хотите сказать, что веб-сервер будет легко найти для обслуживания статического контента
babygame0ver
44

Статические файлы Django могут находиться во многих местах. Файл, который обслуживается, /static/img/icon.pngможет поступать из многих мест . По умолчанию:

  • FileSystemFinderбуду искать img/icon.pngв каждом из STATICFILES_DIRS,
  • AppDirectoriesFinderбудет искать img/icon.pngво staticвложенной папке в каждом из ваших INSTALLED_APPS. Это позволяет библиотекам, таким как Django Admin, добавлять свои собственные статические файлы в ваше приложение.

Теперь: это работает, только если вы запускаете manage.py runserverс DEBUG = 1. Когда вы начнете работать, процесс Django больше не будет обслуживать статические ресурсы. Было бы неэффективно использовать Django для их обслуживания, для этого есть более специализированные инструменты.

Вместо этого вы должны сделать что-то вроде этого:

  • найти все статические файлы из каждого приложения
  • создать единый каталог, содержащий все из них
  • загрузить их куда-нибудь ( staticкаталог где-нибудь на вашем веб-сервере или стороннее хранилище файлов)
  • настройте свой веб-сервер (например, nginx) для обслуживания /static/*непосредственно из этого каталога и перенаправления любых других запросов в Django.

collectstatic - это готовый сценарий, который подготавливает этот каталог для вас, чтобы вы могли напрямую подключить его к сценарию развертывания.

Кос
источник
25

В производственной установке вы хотите иметь постоянные URL-адреса. URL-адрес не изменяется, если не изменяется содержимое файла.

Это сделано для того, чтобы клиенты не имели неправильную версию файла CSS или JS на своем компьютере при открытии веб-страницы из Django. Django staticfiles обнаруживает изменения файлов и соответственно обновляет URL-адреса, так что при изменении файла CSS или JS веб-браузер загружает новую версию.

Обычно это достигается добавлением хеша MD5 к имени файла во время collectstaticвыполнения.

Изменить: также см. Соответствующий ответ для нескольких приложений.

Микко Охтамаа
источник
1
Хороший! не знал этого
doniyor 04
"обычно достигается добавлением хеша MD5" вы имеете в виду ManifestStaticFilesStorage ? Отлично, я этого не видел
Кос,
3
Я думаю, что по умолчанию хеширование MD5 не выполняется, так как по settings.STATICFILES_STORAGEумолчанию StaticFilesStorage, поэтому MD5 сработает только после того, как вы, например, установите его ManifestStaticFilesStorage, я прав?
bakkal 04
@MikkoOhtamaa Но тогда как приложение-интерфейс узнает, на какое имя файла оно должно ссылаться, поскольку последнее всегда меняется?
Лапин
@lapin Хороший вопрос! Естественно, должно существовать 1) отображение последних версий и 2) способ сообщить об этом. Обычно он где-то хранится в файле, а затем, когда вы спрашиваете, «какой полный URL-адрес последней версии X», он дает вам результат.
Микко Охтамаа
9

Это полезно, когда на сайте есть несколько приложений django.

collectstatic затем соберет статические файлы из всех приложений в одном месте, чтобы их можно было использовать в производственной среде.

aa333
источник