Spec-Zone.ru › Django 1.11

Управление статическими файлами (например, изображениями, JavaScript, CSS)

Веб-сайты обычно нуждаются в предоставлении дополнительных файлов, таких как изображения, JavaScript или CSS. В Django эти файлы называются «статическими файлами». Django предоставляет django.contrib.staticfiles для их управления.

Эта страница описывает, как можно предоставлять эти статические файлы.

Настройка статических файлов

  1. Убедитесь, что django.contrib.staticfiles включен в вашем INSTALLED_APPS.
  2. В файле настроек определите STATIC_URL, например:

    STATIC_URL = '/static/'
    
  3. В шаблонах можно либо жестко задать URL, как /static/my_app/example.jpg, или, что предпочтительнее, использовать static тег шаблона для построения URL для заданного относительного пути, используя настроенный STATICFILES_STORAGE механизм хранения (это намного проще, когда вы хотите перейти на сеть доставки контента (CDN) для предоставления статических файлов).

    {% load static %}
    <img src="{% static "my_app/example.jpg" %}" alt="My image"/>
    
  4. Храните статические файлы в папке, названной 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.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 предоставляет удобную команду управления для сбора статических файлов в единый каталог, чтобы вы могли легко их предоставлять.

  1. Установите параметр STATIC_ROOT на каталог, из которого вы хотите предоставлять эти файлы, например:

    STATIC_ROOT = "/var/www/example.com/static/"
    
  2. Запустите команду управления collectstatic:

    $ python manage.py collectstatic
    

    Это скопирует все файлы из ваших статических папок в каталог STATIC_ROOT.

  3. Используйте веб-сервер по вашему выбору для предоставления файлов. Развёртывание статических файлов описывает некоторые распространённые стратегии развёртывания статических файлов.

Дополнительная информация

Этот документ охватывает основы и некоторые распространённые шаблоны использования. Для получения полной информации обо всех настройках, командах, тегах шаблонов и других элементах, включённых в django.contrib.staticfiles, обратитесь к справочнику по staticfiles.

© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/1.11/howto/static-files/index/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API