Обработка статических файлов (например, изображений, 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
в вашем приложении. Например,mon_app/static/mon_app/exemple.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/
, вы можете настроить эту службу, добавив в файл следующий фрагмент кода 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
см. В справке по статическим файлам .