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