Приложение статического файлового менеджера ( 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

Поиск файлов использует настройку STATICFILES_FINDERS . По умолчанию Django просматривает все местоположения, определенные в STATICFILES_DIRS каталоге 'static' приложений, указанном в настройке INSTALLED_APPS .

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

По умолчанию для собранных файлов даются разрешения параметра, FILE_UPLOAD_PERMISSIONS а для каталогов - разрешения FILE_UPLOAD_DIRECTORY_PERMISSIONS . Если вам нужны разные разрешения для этих файлов или каталогов, вы можете создать подкласс Static File Storage Classes и указать параметры 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 в 'chemin.vers.MyStaticFilesStorage' .

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

--noinput, --no-input

НЕ задавайте пользователю никаких вопросов.

--ignore PATTERN, -i PATTERN

Игнорируйте файлы, каталоги или пути, соответствующие этому шаблону стиля "glob". Может использоваться несколько раз, чтобы игнорировать несколько путей. Если вы указываете путь, всегда используйте обычные косые черты, даже в 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', '.*', '*~'] --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 есть installée , и автоматически добавляет статическую файловую службу. Файловая служба не использует эту настройку 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( пути , ** варианты )

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

Хранилище ManifestStaticFilesStorage использует этот класс незаметно для замены путей их «хешированными» эквивалентами и соответствующего обновления кеша.

ManifestStaticFilesStorage

класс storage.ManifestStaticFilesStorage

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

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

Механизм хранения автоматически заменяет в сохраненных файлах пути, соответствующие другим сохраненным файлам, на пути к кэшированным копиям (с помощью метода post_process() ). Регулярные выражения , используемые , чтобы найти эти пути ( django.contrib.staticfiles.storage.HashedFilesMixin.patterns ) покрытие по умолчанию @import правила и выписки URL () из CSS стилей . Например, файл '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

Модуль finders (обнаружение статических файлов) staticfiles имеет атрибут, 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 базового шаблона, который берет путь и объединяет его со статическим префиксом STATIC_URL . Если django.contrib.staticfiles установлено, то тег вместо этого использует метод url() из STATICFILES_STORAGE .
  • Тег шаблона, get_static_prefix который заполняет переменную шаблона статическим префиксом STATIC_URL для немедленного использования или сохранения в переменной.
  • Аналогичный тег шаблона, get_media_prefix который работает аналогично, get_static_prefix но использует MEDIA_URL .

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

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

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

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

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

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

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

Заметка

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

Этот вид автоматически активируется с помощью 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-адреса для обслуживания статических файлов и может быть добавлен в список уже определенных шаблонов 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

Этот подкласс модульного теста TestCase наследуется от django.test.LiveServerTestCase .

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

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

Copyright ©2020 All rights reserved