Как управлять статическими файлами (например, изображениями, 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. Вследствие этого запросы статических файлов не проходят через обычную цепь промежуточного программного обеспечения.
Предоставление загруженных файлов во время разработки
Во время разработки вы можете предоставлять загруженные пользователем медиафайлы из 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_ROOT. - Используйте веб-сервер по вашему выбору для предоставления файлов. Как развернуть статические файлы содержит некоторые распространённые стратегии развертывания статических файлов.
Дополнительная информация
В этом документе были рассмотрены основы и некоторые общие шаблоны использования. Для получения полной информации обо всех настройках, командах, тегах шаблонов и других компонентах, включённых в django.contrib.staticfiles, см. справочник по staticfiles.
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/5.0/howto/static-files/index/