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

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

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

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

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

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

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

    {% load static %}
    <img src="{% static 'my_app/example.jpg' %}" alt="My image">
    
  4. Храните свои статические файлы в папке, которая называется staticв вашем приложении. Например my_app/static/my_app/example.jpg.

Обслуживание файлов

В дополнение к этим шагам настройки вам также необходимо будет обслуживать статические файлы.

Во время разработки, если вы используете django.contrib.staticfiles, это будет выполняться автоматически, если для параметра runserverwhen 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/, вы можете сделать это, добавив следующий фрагмент в свой ROOT_URLCONF:

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 = Truecollectstatic

Развертывание

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 ©2021 All rights reserved