Управление статическими файлами (например, изображениями, 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, какой из них нужен, и самый простой способ это сделать — наделить их пространством имён. То есть, поместив эти статические файлы в другую папку, названную именем приложения.
Предоставление статических файлов во время разработки
Если вы используете 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/2.1/howto/static-files/index/