Управление статическими файлами (например, изображениями, JavaScript, CSS)
Веб-сайты обычно нуждаются в предоставлении дополнительных файлов, таких как изображения, JavaScript или CSS. В Django эти файлы называются «статическими файлами». Django предоставляет django.contrib.staticfiles, чтобы помочь вам их управлять.
Эта страница описывает, как можно предоставить эти статические файлы.
Настройка статических файлов
- Убедитесь, что
django.contrib.staticfilesвключена в вашINSTALLED_APPS. -
В файле настроек определите
STATIC_URL, например:STATIC_URL = '/static/'
-
В ваших шаблонах либо жестко закодируйте URL, как
/static/my_app/myexample.jpg, или, предпочтительно, используйте тег шаблонаstatic, чтобы сгенерировать URL для данного относительного пути, используя настроенное хранилищеSTATICFILES_STORAGE(это значительно упрощает переход на сеть доставки контента (CDN) для предоставления статических файлов).{% load staticfiles %} <img src="{% static "my_app/myexample.jpg" %}" alt="My image"/> - Храните ваши статические файлы в папке с именем
staticв вашем приложении. Например,my_app/static/my_app/myimage.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, см. справочник по статическим файлам.
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/1.9/howto/static-files/index/