Який сенс у Django's collestatic?


86

Це, мабуть, дурне питання, але воно просто не клацає в моїй голові.

У 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/)

Який сенс у цьому? Це не просто створення копії всіх моїх статичних файлів?

Відповіді:


69

Збирайте статичні файли з декількох програм в один шлях

Ну, один Django проект може використовувати кілька додатків , так що поки у вас є тільки один myapp, це може бути на самому справі myapp1, myapp2і т.д.

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

Постійні URL-адреси з ManifestStaticFilesStorage

Примітка про додавання хеша MD5 до імені файлу для версій: Це не є частиною поведінки за замовчуванням collectstatic, як settings.STATICFILES_STORAGEза замовчуванням StaticFilesStorage(що не робить цього)

Хеш MD5 почне діяти ManifestStaticFilesStorage, наприклад, якщо ви встановите його для використання , який рекламує таку поведінку.

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


2
Ви хочете сказати, що веб-серверу буде легко знайти статичний вміст
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 виявляють зміни файлів та відповідно оновлюють URL-адреси, так що, якщо CSS або JS-файл змінюється, веб-браузер завантажує нову версію.

Зазвичай це досягається додаванням хешу MD5 до імені файлу під час collectstaticзапуску.

Редагувати: також перегляньте відповіді на відповіді на кілька програм.


1
Хороший! не знав
донійор

"зазвичай досягається додаванням хешу MD5" ви маєте на увазі ManifestStaticFilesStorage ? Приємно, я цього не бачив
Кос

3
Я думаю, що за замовчуванням не відбувається хешування MD5, оскільки settings.STATICFILES_STORAGEза замовчуванням значення StaticFilesStorage, тому MD5 почне діяти лише після того, як ви, наприклад, встановите його ManifestStaticFilesStorage, я правильно?
баккал

@MikkoOhtamaa Але як тоді інтерфейсний додаток знає, на яке ім'я файлу має посилатись, оскільки останнє завжди змінюється?
Лапін

@lapin Гарне запитання! Природно, що має існувати 1) відображення до останніх версій та 2) спосіб передачі цього. Зазвичай він зберігається десь у файлі, а потім, коли ви запитаєте "яка повна URL-адреса останньої версії X", він видає вам результат.
Мікко Отамаа

9

Це корисно, коли на сайті є кілька програм-джанго.

collectstatic Потім збиратиме статичні файли з усіх програм в одному місці, щоб їх можна було розміщувати у виробничому середовищі.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.