Управление статическими файлами (например, изображениями, JavaScript, CSS) ¶
Веб-сайты обычно должны обслуживать дополнительные файлы, такие как изображения, JavaScript или CSS. В Django мы называем эти файлы «статическими файлами». Django предоставляет
django.contrib.staticfiles
помощь в управлении ими.
На этой странице описывается, как вы можете обслуживать эти статические файлы.
Настройка статических файлов ¶
Убедитесь, что
django.contrib.staticfiles
он включен в вашINSTALLED_APPS
.В вашем файле настроек определите
STATIC_URL
, например:STATIC_URL = '/static/'
В своих шаблонах используйте
static
тег шаблона для создания URL-адреса для заданного относительного пути с использованием файла configureSTATICFILES_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
when 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
см. В справке по статическим файлам .