Управление статическими файлами (например, изображениями, 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/, вы можете сделать это, добавив следующий фрагмент в вашу 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, см. справочник по staticfiles.
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/3.2/howto/static-files/index/