• 3.2
  • 5.0
  • 6.1
  • Версия документации: 3.1

Приложения для работы со статическими файлами

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

См.также

Примеры использования этого приложения для работы со статикой можно найти в разделе Managing static files (e.g. images, JavaScript, CSS). Как работать со статикой на боевом сервере описано в разделе Deploying static files.

Настройки

Смотрите описание настроек приложения staticfiless:

Команды

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

collectstatic

django-admin collectstatic

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

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

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

Файлы ищутся используя бэкенды из enabled finders. По умолчанию проверяются каталоги из STATICFILES_DIRS и подкаталоги 'static' приложений из INSTALLED_APPS.

The collectstatic management command calls the post_process() method of the STATICFILES_STORAGE after each run and passes a list of paths that have been found by the management command. It also receives all command line options of collectstatic. This is used by the ManifestStaticFilesStorage by default.

По умолчанию, созданные файлы получают права доступа из 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)

Then set the STATICFILES_STORAGE setting to 'path.to.MyStaticFilesStorage'.

Обычно используются следующие параметры:

--noinput, --no-input

Никогда НЕ запрашивать ввод у пользователя. Для этого используйте опцию --no-input.

--ignore PATTERN, -i PATTERN

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

--dry-run, -n

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

--clear, -c

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

Создать симлинк для каждого файла вместо копирования.

--no-post-process

Don’t call the post_process() method of the configured STATICFILES_STORAGE storage backend.

--no-default-ignore

Не игнорировать файлы 'CVS', '.*' and ``*~“``(по умолчанию игнорируются).

Полный список параметров можно посмотреть выполнив:

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

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

Список игнорируемых шаблонов по умолчанию, ['CVS', '.*', '*~'], можно настроить более постоянным образом, чем предоставление опции команды --ignore при каждом вызове collectstatic. Предоставьте собственный класс AppConfig, переопределите атрибут ignore_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

Предназначена для отладки, чтобы понять какие файлы будут использоваться при сборе статики.

Установив :djadminopt:`--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

Установив же :djadminopt:`--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, которая автоматом добавляет раздачу статических файлов.

Обычно используются следующие параметры:

--nostatic

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

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

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

Используйте --insecure чтобы раздавать статические файлы через staticfiles даже при DEBUG равном False. Помните, что это крайне неэффективно и возможно небезопасно. Используйте только при разработке, никогда не используйте на боевом сервере. Опция доступна только если приложение staticfiles добавлено в INSTALLED_APPS. runserver --insecure не работает с CachedStaticFilesStorage.

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

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

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

Бэкенды

StaticFilesStorage

class storage.StaticFilesStorage

Наследуется от FileSystemStorage, используйте STATIC_ROOT как расположение файлов и STATIC_URL как основной URL.

storage.StaticFilesStorage.post_process(paths, **options)

Если этот метод определен в хранилище, он вызывается командой управления collectstatic после каждого запуска и получает в виде словаря локальные хранилища и пути к найденным файлам, а также параметры командной строки. Он дает кортежи из трех значений: «исходный_путь, обработанный_путь, обработанный». Значения пути представляют собой строки, а processed представляет собой логическое значение, указывающее, было ли значение подвергнуто постобработке, или исключение, если постобработка не удалась.

CachedStaticFilesStorage использует этот метод, чтобы подменить путь на хешированную версию и соответственно обновить кэш при необходимости.

ManifestStaticFilesStorage

class storage.ManifestStaticFilesStorage

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

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

The storage backend automatically replaces the paths found in the saved files matching other saved files with the path of the cached copy (using the post_process() method). The regular expressions used to find those paths (django.contrib.staticfiles.storage.HashedFilesMixin.patterns) by default covers the @import rule and url() statement of Cascading Style Sheets. For example, the 'css/styles.css' file with the content

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

would be replaced by calling the url() method of the ManifestStaticFilesStorage storage backend, ultimately saving a 'css/styles.55e7cbb9ba48.css' file with the following content:

@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, необходимо выполнить следующие действия:

  • the STATICFILES_STORAGE setting is set to 'django.contrib.staticfiles.storage.ManifestStaticFilesStorage'

  • установить DEBUG в False

  • вы собрали статические файлы командой collectstatic

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

storage.ManifestStaticFilesStorage.manifest_strict

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

Due to the requirement of running collectstatic, this storage typically shouldn’t be used when running tests as collectstatic isn’t run as part of the normal test setup. During testing, ensure that the STATICFILES_STORAGE setting is set to something else like 'django.contrib.staticfiles.storage.StaticFilesStorage' (the default).

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

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

ManifestStaticFilesStorage

class storage.ManifestFilesMixin

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

Модуль поиска файлов

Модуль поиска файлов staticfiles содержит атрибут searched_locations, который содержит список каталогов, где происходит поиск файлов. Например:

from django.contrib.staticfiles import finders

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

Дополнительные функции

Есть дополнительные функции вне staticfiles для работы со статическими файлами:

  • Контекстный процессор django.core.context_processors.static(), который добавляет STATIC_URL в контекст каждого шаблона отрендеренного с использованием RequestContext.

  • The builtin template tag static which takes a path and urljoins it with the static prefix STATIC_URL. If django.contrib.staticfiles is installed, the tag uses the url() method of the STATICFILES_STORAGE instead.

  • Шаблонный тег get_static_prefix, который создает в шаблоне переменную или просто выводит значение STATIC_URL.

  • Шаблонный тег get_media_prefix, который работает как и get_static_prefix, но для MEDIA_URL.

Представления для разработки

Инструменты для работой со статикой предназначены для простого развертывания на боевом сервере. Обычно это выделенный сервер, которые не практично использовать при разработке. Поэтому приложение staticfiles содержит простые представления для раздачи статики dev-сервером.

views.serve(request, path)

Представление, которое раздает статические файлы при разработке.

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

Работает только при DEBUG равном True.

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

Примечание

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

Это представление автоматически используется командой runserver (при DEBUG равном True). Чтобы использовать его с другим dev-сервером, добавьте следующий код в настройки 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),
    ]

Обратите внимание, что начало URL-шаблона (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/.

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

Специальный test case для «живого тестирования»

class testing.StaticLiveServerTestCase

Этот unittest TestCase является дочерним классом django.test.LiveServerTestCase.

Как и родительский класс, позволяет писать тесты с использованием Selenium, PhantomJS, и др., для которых необходим доступ к статическим файлам.

Для раздачи статики использует django.contrib.staticfiles.views.serve(). Поэтому вам не нужно выполнять collectstatic перед запуском тестов.

Back to Top