Как управлять статическими файлами (например, изображениями, JavaScript, CSS)
Веб-сайтам обычно требуется предоставлять дополнительные файлы, такие как изображения, JavaScript или CSS. В Django эти файлы называются «статическими файлами». Django предоставляет django.contrib.staticfiles, помогающее управлять ими.
На этой странице описано, как предоставлять эти статические файлы.
Настройка статических файлов
- Убедитесь, что
django.contrib.staticfilesвключено вINSTALLED_APPS. -
В файле настроек определите
STATIC_URL, например:STATIC_URL = "static/"
-
В шаблонах используйте тег шаблона
static, чтобы создать URL для указанного относительного пути с использованием настроенного псевдонимаstaticfilesSTORAGES.{% 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()).
Этот метод крайне неэффективен и, вероятно, небезопасен, поэтому он не подходит для production-среды.
См. Как развертывать статические файлы, чтобы узнать о подходящих способах предоставления статических файлов в production-среде.
В вашем проекте, вероятно, также есть статические ресурсы, не привязанные к конкретному приложению. Помимо использования каталога static/ внутри приложений, можно определить в файле настроек список каталогов (STATICFILES_DIRS), в которых Django также будет искать статические файлы. Например:
STATICFILES_DIRS = [
BASE_DIR / "static",
"/var/www/static/",
]
Подробнее о том, как staticfiles находит файлы, см. в документации к настройке STATICFILES_FINDERS.
Пространства имён статических файлов
Возможно, мы могли бы размещать статические файлы непосредственно в 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().
Этот способ не подходит для production-среды! О некоторых распространённых способах развертывания см. в разделе Как развертывать статические файлы.
Например, если 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.
Наконец, статические файлы предоставляются через обёртку на уровне приложения WSGI. В результате запросы статических файлов не проходят через обычную цепочку промежуточного программного обеспечения.
Предоставление загруженных пользователями файлов во время разработки
Во время разработки можно предоставлять загруженные пользователями медиафайлы из MEDIA_ROOT с помощью представления django.views.static.serve().
Этот способ не подходит для production-среды! О некоторых распространённых способах развертывания см. в разделе Как развертывать статические файлы.
Например, если 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/6.0/howto/static-files/index/