Управление статическими файлами (например, изображениями, JavaScript, CSS)
Веб-сайты обычно нуждаются в предоставлении дополнительных файлов, таких как изображения, JavaScript или CSS. В Django эти файлы называются «статическими файлами». Django предоставляет django.contrib.staticfiles, чтобы помочь вам в их управлении.
Эта страница описывает, как вы можете предоставить эти статические файлы.
Настройка статических файлов
- Убедитесь, что
django.contrib.staticfilesвключен в вашINSTALLED_APPS. -
В вашем файле настроек определите
STATIC_URL, например:STATIC_URL = '/static/'
-
В ваших шаблонах либо жестко закодируйте URL, как
/static/my_app/example.jpg, или, предпочтительно, используйтеstaticтег шаблона для построения URL для данного относительного пути, используя настроенное хранилищеSTATICFILES_STORAGE(это значительно упрощает переход на сеть доставки контента (CDN) для предоставления статических файлов).{% 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 = [
os.path.join(BASE_DIR, "static"),
'/var/www/static/',
]
См. документацию для настройки STATICFILES_FINDERS для получения подробной информации о том, как staticfiles находит ваши файлы.
Именование статических файлов
Сейчас мы, возможно, сможем обойтись без размещения наших статических файлов непосредственно в my_app/static/ (а не создания другой поддиректории my_app), но это было бы не лучшим решением. Django будет использовать первый статический файл, имя которого совпадает, и если у вас был статический файл с тем же именем в другом приложении, Django не смог бы отличить их. Нам нужно указать Django, какой именно нужен, и самый простой способ сделать это – использовать именование, то есть размещение статических файлов внутри другой директории, названной в честь приложения.
Предоставление статических файлов во время разработки
Если вы используете django.contrib.staticfiles, как описано выше, runserver сделает это автоматически, когда DEBUG установлено в True. Если у вас нет django.contrib.staticfiles в INSTALLED_APPS, вы всё ещё можете вручную предоставить статические файлы, используя представление django.contrib.staticfiles.views.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.contrib.staticfiles.views.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, см. справочник по staticfiles.
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/1.10/howto/static-files/index/