staticfilesПриложение

django.contrib.staticfiles собирает статические файлы из каждого из ваших приложений (и любых других мест, которые вы укажете) в единое место, которое может легко использоваться в производственной среде.

Смотрите также

Введение в приложение для статических файлов и некоторые примеры использования см. В разделе Управление статическими файлами (например, изображениями, JavaScript, CSS) . Инструкции по развертыванию статических файлов см. В разделе Развертывание статических файлов .

Настройки

См. Настройки staticfiles для получения подробной информации о следующих настройках:

Команды управления

django.contrib.staticfiles предоставляет три команды управления.

collectstatic

django-admin collectstatic

Собирает статические файлы в STATIC_ROOT.

Повторяющиеся имена файлов по умолчанию разрешаются аналогично тому, как работает разрешение шаблонов: будет использоваться файл, который впервые будет найден в одном из указанных мест. Если вы запутались, findstaticкоманда может показать вам, какие файлы были найдены.

При последующих collectstaticзапусках (если STATIC_ROOTон не пустой) файлы копируются только в том случае, если их измененная временная метка больше, чем временная метка файла в STATIC_ROOT. Поэтому, если вы удаляете приложение из INSTALLED_APPS, рекомендуется использовать эту опцию для удаления устаревших статических файлов.collectstatic --clear

Поиск файлов осуществляется с помощью расширения . По умолчанию выполняется поиск во всех местоположениях, определенных в каталоге приложений, указанном параметром, и в каталоге приложений .enabled findersSTATICFILES_DIRS'static'INSTALLED_APPS

Команда collectstaticуправления вызывает post_process() метод STATICFILES_STORAGEпосле каждого запуска и передает список путей, которые были найдены командой управления. Он также получает все параметры командной строки collectstatic. Это используется ManifestStaticFilesStorage по умолчанию.

По умолчанию собранные файлы получают разрешения, FILE_UPLOAD_PERMISSIONSа собранные каталоги получают разрешения от них FILE_UPLOAD_DIRECTORY_PERMISSIONS. Если вам нужны разные разрешения для этих файлов и / или каталогов, вы можете создать подкласс любого из классов хранения статических файлов и указать параметры file_permissions_modeи / или directory_permissions_modeсоответственно. Например:

from django.contrib.staticfiles import storage

class MyStaticFilesStorage(storage.StaticFilesStorage):
    def __init__(self, *args, **kwargs):
        kwargs['file_permissions_mode'] = 0o640
        kwargs['directory_permissions_mode'] = 0o760
        super().__init__(*args, **kwargs)

Затем установите STATICFILES_STORAGEзначение 'path.to.MyStaticFilesStorage'.

Вот некоторые часто используемые варианты:

--noinput, --no-input

НЕ запрашивайте у пользователя какие-либо данные.

--ignore PATTERN, -i PATTERN

Игнорируйте файлы, каталоги или пути, соответствующие этому шаблону в стиле глобуса. Используйте несколько раз, чтобы больше не обращать внимания. При указании пути всегда используйте косую черту, даже в Windows.

--dry-run, -n

Делайте все, кроме изменения файловой системы.

--clear, -c

Удалите существующие файлы, прежде чем пытаться скопировать или связать исходный файл.

Вместо копирования создайте символическую ссылку на каждый файл.

--no-post-process

Не вызывайте post_process() метод настроенной STATICFILES_STORAGEсерверной части хранилища.

--no-default-ignore

Не игнорируйте общие частные модели Glob стиль 'CVS', '.*' и '*~'.

Для получения полного списка параметров обратитесь к собственной справке по командам, запустив:

$ python manage.py collectstatic --help
... \> py manage.py collectstatic --help

Настройка списка игнорируемых паттернов

Список игнорируемых шаблонов по умолчанию , можно настроить более постоянным способом, чем предоставление опции команды при каждом вызове. Предоставьте настраиваемый класс, переопределите атрибут этого класса и замените его путем к этому классу в своих настройках:['CVS', '.*', '*~']--ignorecollectstaticAppConfigignore_patterns'django.contrib.staticfiles'INSTALLED_APPS

from django.contrib.staticfiles.apps import StaticFilesConfig

class MyStaticFilesConfig(StaticFilesConfig):
    ignore_patterns = [...]  # your custom ignore list

findstatic

django-admin findstatic staticfile [staticfile ...]

Выполняет поиск одного или нескольких относительных путей с помощью включенных средств поиска.

Например:

$ python manage.py findstatic css/base.css admin/js/core.js
Found 'css/base.css' here:
  /home/special.polls.com/core/static/css/base.css
  /home/polls.com/core/static/css/base.css
Found 'admin/js/core.js' here:
  /home/polls.com/src/django/contrib/admin/media/js/core.js
...\> py manage.py findstatic css\base.css admin\js\core.js
Found 'css/base.css' here:
  /home/special.polls.com/core/static/css/base.css
  /home/polls.com/core/static/css/base.css
Found 'admin/js/core.js' here:
  /home/polls.com/src/django/contrib/admin/media/js/core.js
findstatic --first

По умолчанию найдены все совпадающие местоположения. Чтобы вернуть только первое совпадение для каждого относительного пути, используйте --firstопцию:

$ python manage.py findstatic css/base.css --first
Found 'css/base.css' here:
  /home/special.polls.com/core/static/css/base.css
...\> py manage.py findstatic css\base.css --first
Found 'css/base.css' here:
  /home/special.polls.com/core/static/css/base.css

Это средство отладки; он покажет вам, какой именно статический файл будет собран для заданного пути.

Установив --verbosityфлаг в 0, вы можете подавить дополнительный вывод и просто получить имена путей:

$ python manage.py findstatic css/base.css --verbosity 0
/home/special.polls.com/core/static/css/base.css
/home/polls.com/core/static/css/base.css
...\> py manage.py findstatic css\base.css --verbosity 0
/home/special.polls.com/core/static/css/base.css
/home/polls.com/core/static/css/base.css

С другой стороны, установив --verbosityфлаг на 2, вы можете получить все каталоги, в которых производился поиск:

$ python manage.py findstatic css/base.css --verbosity 2
Found 'css/base.css' here:
  /home/special.polls.com/core/static/css/base.css
  /home/polls.com/core/static/css/base.css
Looking in the following locations:
  /home/special.polls.com/core/static
  /home/polls.com/core/static
  /some/other/path/static
...\> py manage.py findstatic css\base.css --verbosity 2
Found 'css/base.css' here:
  /home/special.polls.com/core/static/css/base.css
  /home/polls.com/core/static/css/base.css
Looking in the following locations:
  /home/special.polls.com/core/static
  /home/polls.com/core/static
  /some/other/path/static

runserver

django-admin runserver [addrport]

Переопределяет основную runserverкоманду, если staticfilesприложение есть, installedи добавляет автоматическое обслуживание статических файлов. Обслуживание файлов не выполняется MIDDLEWARE.

Команда добавляет эти параметры:

--nostatic

Используйте --nostaticпараметр, чтобы полностью отключить обслуживание статических файлов в приложении staticfiles . Этот параметр доступен только в том случае, если приложение staticfiles находится в INSTALLED_APPSнастройках вашего проекта .

Пример использования:

$ django-admin runserver --nostatic
...\> django-admin runserver --nostatic
--insecure

Используйте --insecureпараметр для принудительного обслуживания статических файлов с помощью приложения staticfiles , даже если для DEBUG параметра установлено значение False. Используя это, вы признаете тот факт, что это крайне неэффективно и, вероятно, небезопасно . Это предназначено только для локальной разработки, никогда не должно использоваться в производстве и доступно только в том случае, если приложение staticfiles находится в INSTALLED_APPSнастройках вашего проекта .

--insecureне работает с ManifestStaticFilesStorage.

Пример использования:

$ django-admin runserver --insecure
...\> django-admin runserver --insecure

Хранилища

StaticFilesStorage

класс storage.StaticFilesStorage

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

storage.StaticFilesStorage.post_process( пути , ** варианты )

Если этот метод определен в хранилище, он вызывается командой collectstaticуправления после каждого запуска и получает в качестве словаря локальные хранилища и пути к найденным файлам, а также параметры командной строки. Это дает кортежи трех значений: . Значения пути являются строками и являются логическими значениями, указывающими, было ли значение обработано постобработкой или нет, или исключение, если постобработка не удалась.original_path, processed_path, processedprocessed

В ManifestStaticFilesStorage использует это за кулисами , чтобы заменить пути их хэшированных коллегами и обновлять кэш соответствующим образом .

ManifestStaticFilesStorage

класс storage.ManifestStaticFilesStorage

Подкласс StaticFilesStorage серверной части хранилища, в котором хранятся имена файлов, которые он обрабатывает, путем добавления хэша MD5 содержимого файла к имени файла. Например, файл css/styles.cssтакже будет сохранен как css/styles.55e7cbb9ba48.css.

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

Серверная часть хранилища автоматически заменяет пути, найденные в сохраненных файлах, соответствующие другим сохраненным файлам, на путь к кэшированной копии (используя post_process() метод). Регулярные выражения, используемые для поиска этих путей ( django.contrib.staticfiles.storage.HashedFilesMixin.patterns) по умолчанию, охватывают правило @import и оператор url () каскадных таблиц стилей . Например, 'css/styles.css'файл с содержимым

@import url("../admin/css/base.css");

будет заменен вызовом url() метода ManifestStaticFilesStorageсерверной части хранилища, что в конечном итоге приведет к сохранению 'css/styles.55e7cbb9ba48.css'файла со следующим содержимым:

@import url("../admin/css/base.27e20196a850.css");
storage.ManifestStaticFilesStorage.max_post_process_passes

Поскольку статические файлы могут ссылаться на другие статические файлы, пути к которым необходимо заменить, может потребоваться несколько проходов замены путей, пока хэши файлов не сойдутся. Чтобы предотвратить бесконечный цикл из-за того, что хэши не сходятся (например, если 'foo.css'ссылки, 'bar.css'которые ссылаются 'foo.css'), существует максимальное количество проходов, прежде чем постобработка будет прекращена. В случаях с большим количеством ссылок может потребоваться большее количество проходов. Увеличьте максимальное количество проходов путем ManifestStaticFilesStorageсоздания подклассов и установки max_post_process_passes атрибута. По умолчанию 5.

Для включения ManifestStaticFilesStorageнеобходимо убедиться, что выполняются следующие требования:

  • STATICFILES_STORAGEнастройка установлена 'django.contrib.staticfiles.storage.ManifestStaticFilesStorage'
  • DEBUGнастройка установленаFalse
  • вы собрали все свои статические файлы с помощью команды collectstaticуправления

Поскольку создание хэша MD5 может снизить производительность вашего веб-сайта во время выполнения, staticfilesсопоставление с хешированными именами для всех обработанных файлов будет автоматически сохранено в файле с именем staticfiles.json. Это происходит один раз, когда вы запускаете команду collectstaticуправления.

storage.ManifestStaticFilesStorage.manifest_strict

Если файл не найден в staticfiles.jsonманифесте во время выполнения, создается ValueError. Это поведение можно отключить, ManifestStaticFilesStorageсоздав подклассы и установив для manifest_strictатрибута значение False- несуществующие пути останутся неизменными.

Из-за необходимости запуска collectstaticэто хранилище обычно не следует использовать при запуске тестов, так как collectstaticоно не запускается как часть обычной настройки теста. Во время тестирования убедитесь, что для STATICFILES_STORAGEпараметра установлено другое значение, подобное 'django.contrib.staticfiles.storage.StaticFilesStorage'(по умолчанию).

storage.ManifestStaticFilesStorage.file_hash( name , content = None )

Метод, который используется при создании хешированного имени файла. Необходимо вернуть хеш для указанного имени файла и содержимого. По умолчанию он вычисляет хэш MD5 из фрагментов содержимого, как указано выше. Не стесняйтесь переопределить этот метод, чтобы использовать свой собственный алгоритм хеширования.

ManifestFilesMixin

класс storage.ManifestFilesMixin

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

Модуль Finders

staticfilesУ finders есть searched_locationsатрибут, который представляет собой список путей к каталогам, в которых искали. Пример использования:

from django.contrib.staticfiles import finders

result = finders.find('css/base.css')
searched_locations = finders.searched_locations

Другие помощники

За пределами staticfilesприложения есть еще несколько помощников для работы со статическими файлами:

  • Процессор django.template.context_processors.static()контекста, который добавляет STATIC_URLк каждому шаблону контекст, отображаемый с RequestContextконтекстами.
  • Встроенный тег шаблона, staticкоторый берет путь и соединяет его со статическим префиксом url STATIC_URL. Если django.contrib.staticfilesустановлен, тег использует вместо этого url() метод STATICFILES_STORAGE.
  • Встроенный тег шаблона, get_static_prefixкоторый заполняет переменную шаблона статическим префиксом, STATIC_URLкоторый будет использоваться как переменная или напрямую.
  • Аналогичный тег шаблона, get_media_prefixкоторый работает аналогично, get_static_prefixно использует MEDIA_URL.

Представление разработки статических файлов

Инструменты статических файлов в основном предназначены для того, чтобы помочь в успешном развертывании статических файлов в производственной среде. Обычно это означает отдельный выделенный статический файловый сервер, с которым приходится возиться с большими накладными расходами при локальной разработке. Таким образом, staticfilesприложение поставляется с быстрым и грязным вспомогательным представлением, которое вы можете использовать для локального обслуживания файлов в процессе разработки.

views.serve( запрос , путь )

Эта функция просмотра обслуживает статические файлы в разработке.

Предупреждение

Это представление будет работать, только если оно DEBUGесть True.

Это потому, что это представление крайне неэффективно и, вероятно, небезопасно . Это предназначено только для локальной разработки и никогда не должно использоваться в производственной среде .

Примечание

Чтобы угадать типы содержимого обслуживаемых файлов, это представление полагается на mimetypesмодуль из стандартной библиотеки Python, которая сама полагается на файлы карты базовой платформы. Если вы обнаружите, что это представление не возвращает правильные типы содержимого для определенных файлов, скорее всего, файлы карты платформы неверны или нуждаются в обновлении. Это может быть достигнуто, например, путем установки или обновления mailcapпакета в дистрибутиве Red Hat, mime-supportв дистрибутиве Debian или путем редактирования ключей HKEY_CLASSES_ROOTв реестре Windows.

Это представление автоматически включается с помощью runserverDEBUGпараметром, установленным на True). Чтобы использовать представление с другим локальным сервером разработки, добавьте следующий фрагмент в конец основной конфигурации URL:

from django.conf import settings
from django.contrib.staticfiles import views
from django.urls import re_path

if settings.DEBUG:
    urlpatterns += [
        re_path(r'^static/(?P<path>.*)$', views.serve),
    ]

Обратите внимание, что начало шаблона ( r'^static/') должно быть вашей STATIC_URLнастройкой.

Поскольку это немного привередливо, есть вспомогательная функция, которая сделает это за вас:

urls.staticfiles_urlpatterns()

Это вернет правильный шаблон URL для обслуживания статических файлов в вашем уже определенном списке шаблонов. Используйте это так:

from django.contrib.staticfiles.urls import staticfiles_urlpatterns

# ... the rest of your URLconf here ...

urlpatterns += staticfiles_urlpatterns()

Это проверит ваши STATIC_URLнастройки и подключит представление для обслуживания статических файлов соответственно. Не забудьте установить соответствующий STATICFILES_DIRSпараметр, чтобы django.contrib.staticfilesзнать, где искать файлы помимо файлов в каталогах приложений.

Предупреждение

Эта вспомогательная функция будет работать только , если DEBUGэто True и ваша STATIC_URLустановка не пуста и не полный URL , такие как http://static.example.com/.

Это потому, что это представление крайне неэффективно и, вероятно, небезопасно . Это предназначено только для локальной разработки и никогда не должно использоваться в производственной среде .

Специализированный тестовый пример для поддержки «живого тестирования»

класс testing.StaticLiveServerTestCase

Этот подкласс unittest TestCase расширяется django.test.LiveServerTestCase.

Как и его родительский объект, вы можете использовать его для написания тестов, которые включают запуск тестируемого кода и использование его с помощью инструментов тестирования через HTTP (например, Selenium, PhantomJS и т. Д.), Из-за чего необходимо, чтобы статические ресурсы также были опубликованы.

Но, учитывая тот факт, что он использует django.contrib.staticfiles.views.serve()представление, описанное выше, он может прозрачно наложить во время выполнения теста ресурсы, предоставленные staticfilesискателями. Это означает, что вам не нужно запускать collectstaticдо или как часть настройки тестов.

Copyright ©2021 All rights reserved