Как управлять статическими файлами (например, изображениями, 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.1/howto/static-files/index/