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 finders
STATICFILES_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
¶
Удалите существующие файлы, прежде чем пытаться скопировать или связать исходный файл.
-
--link
,
-l
¶
Вместо копирования создайте символическую ссылку на каждый файл.
-
--no-post-process
¶
Не вызывайте
post_process()
метод настроеннойSTATICFILES_STORAGE
серверной части хранилища.
-
--no-default-ignore
¶
Не игнорируйте общие частные модели Glob стиль
'CVS'
,'.*'
и'*~'
.
Для получения полного списка параметров обратитесь к собственной справке по командам, запустив:
$ 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
Это средство отладки; он покажет вам, какой именно статический файл будет собран для заданного пути.
Установив --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, processed
processed
В 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
который берет путь и соединяет его со статическим префиксом urlSTATIC_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.
Это представление автоматически включается с помощью runserver
(с
DEBUG
параметром, установленным на 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
до или как часть настройки тестов.