Как управлять статическими файлами (например, изображениями, JavaScript, CSS)
Веб-сайтам обычно требуется обслуживать дополнительные файлы, такие как изображения, JavaScript или CSS. В Django эти файлы называются «статическими файлами». Django предоставляет django.contrib.staticfiles, чтобы помочь вам с их управлением.
На этой странице описано, как можно обслуживать эти статические файлы.
Настройка статических файлов
- Убедитесь, что
django.contrib.staticfilesвключен в вашемINSTALLED_APPS. -
В файле настроек определите
STATIC_URL, например:STATIC_URL = 'static/'
-
В ваших шаблонах используйте
staticтег шаблона для создания URL для заданного относительного пути, используя настроенныйSTATICFILES_STORAGE.{% 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, см. справочник по статическим файлам.
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/4.1/howto/static-files/index/