Управление статическими файлами (например, изображениями, 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 = [
os.path.join(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, см. справочник по staticfiles.
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/3.0/howto/static-files/index/