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

Какой смысл в Django собирать?

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

В Django соглашение должно поместить все ваши статические файлы (i.e 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/)

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

4b9b3361

Ответ 1

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

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

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

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

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

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

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

Ответ 2

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

Ответ 3

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

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

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

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

Ответ 4

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

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