Какой смысл collectstatic Джанго?

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

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

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

In mysite/settings.py у меня:

STATIC_ROOT = 'staticfiles'

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

python manage.py collectstatic   

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

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

4 ответов


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

Ну, один Джанго проект может использовать несколько приложения, так что пока там только один myapp может быть myapp1, myapp2, etc

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

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

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

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

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


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

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

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

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


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

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

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

Edit: Также см. связанный ответ на несколько приложений.


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

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