Как управлять статическими файлами (например, изображениями, JavaScript, CSS)
Веб-сайты обычно нуждаются в предоставлении дополнительных файлов, таких как изображения, JavaScript или CSS. В Django эти файлы называются «статическими файлами». Django предоставляет django.contrib.staticfiles для их управления.
Эта страница описывает, как можно предоставить эти статические файлы.
Настройка статических файлов
- Убедитесь, что
django.contrib.staticfilesвключен в вашемINSTALLED_APPS. -
В файле настроек определите
STATIC_URL, например:STATIC_URL = "static/"
-
В шаблонах используйте
staticтег шаблона для построения URL для заданного относительного пути, используя настроенныйstaticfilesSTORAGESпсевдоним.{% load static %} <img src="{% static 'my_app/example.jpg' %}" alt="My image"> - Сохраняйте статические файлы в папке с именем
staticв вашем приложении. Напримерmy_app/static/my_app/example.jpg.
Предоставление файлов
В дополнение к этим шагам по настройке, вам также необходимо фактически предоставлять статические файлы.
Во время разработки, если вы используете django.contrib.staticfiles, это будет сделано автоматически командой runserver, когда DEBUG установлено в значение True (см. django.contrib.staticfiles.views.serve()).
Этот метод крайне неэффективен и, вероятно, небезопасен, поэтому он не подходит для производства.
См. Как развернуть статические файлы для правильных стратегий предоставления статических файлов в производственных средах.
Ваш проект, вероятно, также будет содержать статические ресурсы, которые не привязаны к конкретному приложению. В дополнение к использованию директории static/ внутри ваших приложений, вы можете определить список директорий (STATICFILES_DIRS) в файле настроек, где Django также будет искать статические файлы. Например:
STATICFILES_DIRS = [
BASE_DIR / "static",
"/var/www/static/",
]
См. документацию для параметра STATICFILES_FINDERS, чтобы узнать подробнее, как staticfiles находит ваши файлы.
Имена пространств статических файлов
Сейчас мы можем обойтись без помещения статических файлов непосредственно в my_app/static/ (а не создание ещё одной my_app поддиректории), но это на самом деле плохая идея. Django будет использовать первый статический файл, имя которого соответствует, и если у вас был статический файл с одинаковым именем в другом приложении, Django не смог бы их различить. Нам нужно указать Django, какой именно файл нужен, и лучший способ сделать это — пространство имён их. То есть, поместив эти статические файлы в другую папку, названную самим приложением.
Вы можете назначить статическим ресурсам пространство имён в STATICFILES_DIRS, указав префиксы.
Предоставление статических файлов во время разработки
Если вы используете django.contrib.staticfiles, как описано выше, runserver сделает это автоматически, когда DEBUG установлено в True. Если у вас нет django.contrib.staticfiles в INSTALLED_APPS, вы по-прежнему можете вручную предоставлять статические файлы, используя представление django.views.static.serve().
Это не подходит для использования в производстве! Для некоторых распространённых стратегий развертывания, см. Как развернуть статические файлы.
Например, если ваш STATIC_URL определён как static/, вы можете сделать это, добавив следующий фрагмент в свой urls.py:
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
# ... the rest of your URLconf goes here ...
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
Примечание
Эта вспомогательная функция работает только в режиме отладки и только если заданный префикс локален (например, static/), а не URL (например, http://static.example.com/).
Также эта вспомогательная функция обслуживает только фактическую папку STATIC_ROOT; она не выполняет поиск статических файлов, как django.contrib.staticfiles.
Наконец, статические файлы предоставляются через оболочку на уровне WSGI-приложения. В результате запросы статических файлов не проходят через обычную цепочку middleware.
Предоставление файлов, загруженных пользователем, во время разработки
Во время разработки вы можете предоставлять загруженные пользователем файлы медиа из MEDIA_ROOT с помощью представления django.views.static.serve().
Это не подходит для использования в производстве! Для некоторых распространённых стратегий развертывания, см. Как развернуть статические файлы.
Например, если ваш MEDIA_URL определён как media/, вы можете сделать это, добавив следующий фрагмент в свой ROOT_URLCONF:
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
# ... the rest of your URLconf goes here ...
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
Примечание
Эта вспомогательная функция работает только в режиме отладки и только если заданный префикс локален (например, media/), а не URL (например, http://media.example.com/).
Тестирование
При запуске тестов, использующих реальные HTTP-запросы вместо встроенного клиента тестирования (т.е. при использовании встроенного LiveServerTestCase), статические ресурсы должны предоставляться вместе со всем остальным содержимым, чтобы тестовая среда максимально точно воспроизводила реальную, но LiveServerTestCase имеет только очень базовые функции предоставления статических файлов: он не знает о функции поиска приложения staticfiles и предполагает, что статическое содержимое уже собрано в STATIC_ROOT.
Из-за этого, staticfiles поставляет свой собственный django.contrib.staticfiles.testing.StaticLiveServerTestCase, подкласс встроенного, который способен прозрачно предоставлять все ресурсы во время выполнения этих тестов очень похожим образом, как мы получаем во время разработки с DEBUG = True, т.е. без необходимости сначала собирать их с помощью collectstatic.
Развёртывание
django.contrib.staticfiles предоставляет удобную команду управления для сбора статических файлов в одном каталоге, чтобы вы могли легко их предоставить.
-
Установите параметр
STATIC_ROOTна каталог, из которого вы хотите предоставлять эти файлы, например:STATIC_ROOT = "/var/www/example.com/static/"
-
Запустите команду управления
collectstatic:$ python manage.py collectstatic
Это скопирует все файлы из ваших папок static в каталог
STATIC_ROOT. - Используйте веб-сервер по своему выбору для предоставления файлов. Как развернуть статические файлы охватывает некоторые распространённые стратегии развертывания статических файлов.
Дополнительная информация
В этом документе были рассмотрены основы и некоторые распространённые шаблоны использования. Для получения полной информации обо всех настройках, командах, тегах шаблонов и других компонентах, включённых в django.contrib.staticfiles, см. справочник по staticfiles.
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/5.2/howto/static-files/index/