Managing static files (e.g. images, JavaScript, CSS)¶
Веб-приложения обычно требуют различные дополнительные файлы для своей работы (изображения, CSS, Javascript и др.). В Django их принято называть «статическими файлами»(прим.пер. - или «статика»). Django предоставляет приложение django.contrib.staticfiles для работы с ними.
Этот раздел описывает как работать с ними.
Настройка статики¶
Убедитесь что
django.contrib.staticfilesдобавленоINSTALLED_APPS.В настройках укажите
STATIC_URL, например:STATIC_URL = '/static/'
In your templates, use the
statictemplate tag to build the URL for the given relative path using the configuredSTATICFILES_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()).
Потому что это представление очень неэффективно и, возможно, небезопасно. Оно предназначено только для разработки, и не должно использоваться на боевом сервере.
Способы раздачи статических файлов описаны в разделе Deploying static files.
Ваш проект, возможно, будет содержать статические файлы, которые не относятся ни к одному из приложений. Настройка STATICFILES_DIRS указывает каталоги, которые проверяются на наличие статических файлов. По умолчанию эта настройка пустая. Например:
STATICFILES_DIRS = [
BASE_DIR / "static",
'/var/www/static/',
]
Смотрите описание настройки STATICFILES_FINDERS чтобы узнать, как staticfiles находит файлы.
Пространства имен для статических файлов
Вы можете добавлять статические файлы непосредственно в каталог my_app/static/ (не создавая подкаталог my_app), но это плохая идея. Django использует первый найденный по имени файл и, если у вас есть файлы с одинаковым названием в разных приложениях, Django не сможет использовать оба. Необходимо как-то указать, какой файл использовать, и самый простой способ – это пространство имен. Просто положите их в подкаталог с названием приложения (my_app/static/my_app).
Вы можете распределять по именованным пространствам наборы статики с помощью STATICFILES_DIRS, указав префиксы.
Раздача статических файлов при разработке¶
Если вы используете django.contrib.staticfiles как описано выше, runserver все сделает автоматически, если DEBUG равна True. Если django.contrib.staticfiles не добавлено в INSTALLED_APPS, вы можете раздавать статические файлы используя представление django.views.static.serve().
Не используйте его на боевом сервере! Способы раздачи статических файлов описаны в разделе Deploying static files.
For example, if your STATIC_URL is defined as /static/, you can do
this by adding the following snippet to your 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)
Примечание
This helper function works only in debug mode and only if
the given prefix is local (e.g. /static/) and not a URL (e.g.
http://static.example.com/).
Также эта функция раздает файлы из каталога STATIC_ROOT не выполняя поиск всех статических файлов, как это делает django.contrib.staticfiles.
Раздача файлов, загруженных пользователем, при разработке¶
При разработке медиа файлы из MEDIA_ROOT можно раздавать, используя представление django.views.static.serve().
Не используйте его на боевом сервере! Способы раздачи статических файлов описаны в разделе Deploying static files.
For example, if your MEDIA_URL is defined as /media/, you can do
this by adding the following snippet to your 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)
Примечание
This helper function works only in debug mode and only if
the given prefix is local (e.g. /media/) and not a URL (e.g.
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/"
Run the
collectstaticmanagement command:$ python manage.py collectstatic
Она скопирует все статические файлы в каталоге
STATIC_ROOT.Используйте любой веб-сервер для раздачи этих файлов. Способы раздачи статических файлов описаны в разделе Deploying static files.
Узнайте больше¶
Этот документ описывает основные и самые распространенные практики. Подробности о настройках, командах, шаблонных тегах и других деталях, включая django.contrib.staticfiles, смотрите раздел о статических файлах.