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

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

На этой странице рассказывается, как обслуживать эти статические файлы.

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

  1. Убедитесь, что django.contrib.staticfiles это включено в вашу настройку INSTALLED_APPS .

  2. В вашем файле настроек определите STATIC_URL , например:

    STATIC_URL = '/static/'
    
  3. В своих шаблонах используйте тег шаблона static для создания URL-адреса заданного относительного пути с использованием STATICFILES_STORAGE настроенного хранилища .

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

  1. Задайте настройку STATIC_ROOT в соответствии с каталогом, из которого вы хотите обслуживать файлы, например:

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

    $ python manage.py collectstatic
    

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

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

Узнать больше

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

Copyright ©2020 All rights reserved