Управление статическими файлами (например, изображениями, 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.
Предоставление загруженных файлов во время разработки
Во время разработки вы можете предоставлять загруженные пользователем медиафайлы из MEDIA_ROOT с помощью django.views.static.serve() представления.
Это не подходит для использования в производстве! Некоторые распространённые стратегии развёртывания см. в Развёртывании статических файлов.
Например, если MEDIA_URL определён как /media/, вы можете сделать это, добавив следующий фрагмент в ваш файл urls.py:
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/3.1/howto/static-files/index/