Как управлять статическими файлами (например, изображениями, JavaScript, CSS)¶
Веб-сайты обычно нуждаются в дополнительных файлах, таких как изображения, JavaScript или CSS. В Django мы называем эти файлы «статическими файлами». Django предоставляет django.contrib.staticfiles , чтобы помочь вам управлять ими.
На этой странице описано, как вы можете обслуживать эти статические файлы.
Настройка статических файлов¶
- Убедитесь, что django.contrib.staticfiles включено в ваше INSTALLED_APPS .
- В файле настроек определите STATIC_URL , например:
STATIC_URL = "static/"
load static %> img src=" static 'my_app/example.jpg' %>" alt="My image">
В дополнение к этим шагам по настройке, вам также нужно будет фактически обслуживать статические файлы.
Во время разработки, если вы используете 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 , указав prefixes .
Обслуживание статических файлов во время разработки¶
Если вы используете 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 .
Наконец, статические файлы обслуживаются через обертку на прикладном уровне WSGI. Как следствие, запросы на статические файлы не проходят через обычную middleware chain .
Обслуживание файлов, загруженных пользователем во время разработки¶
Во время разработки вы можете обслуживать загруженные пользователем медиафайлы из 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 имеет только очень базовую функциональность обслуживания статических файлов: Он не знает о функции finders приложения staticfiles и предполагает, что статическое содержимое уже собрано под STATIC_ROOT .
В связи с этим staticfiles поставляет свой собственный django.contrib.staticfiles.testing.StaticLiveServerTestCase , подкласс встроенного, который имеет возможность прозрачно обслуживать все активы во время выполнения этих тестов способом, очень похожим на тот, который мы получаем во время разработки с помощью DEBUG = True , т.е. без необходимости сначала собирать их с помощью collectstatic .
Развертывание¶
django.contrib.staticfiles предоставляет удобную команду управления для сбора статических файлов в одном каталоге, чтобы вы могли легко их обслуживать.
-
Установите параметр STATIC_ROOT в каталог, из которого вы хотите обслуживать эти файлы, например:
STATIC_ROOT = "/var/www/example.com/static/"
$ python manage.py collectstatic
Узнать больше¶
В этом документе рассмотрены основы и некоторые общие шаблоны использования. Для получения полной информации обо всех настройках, командах, тегах шаблонов и других элементах, включенных в django.contrib.staticfiles , смотрите the staticfiles reference .
Как подключить статику в django
Веб-приложение, как правило, использует различные статические файлы — изображения, файлы стилей css, скриптов javascript и так далее. Рассмотрим, как мы можем использовать подобые файлы.
При создании проекта Django он уже имеет некоторую базовую настройку для работы со статическими файлами. В частности, в файле settings.py определена переменная STATIC_URL , которая хранит путь к каталогу со статическими файлами:
STATIC_URL = 'static/'
А среди установленных приложений в переменной INSTALLED_APPS указано приложение django.contrib.staticfiles
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'hello', ]

Переменная STATIC_URL имеет значение «static/», а это значит, что нам достаточно создать в папке приложения каталог с именем «static» и добавить в него необходимые нам статические файлы. Но, естественно, при необходимости через данную настройку мы можем изменить расположение каталога статических файлов.
Итак, добавим в папку приложения новый каталог static . Чтобы не сваливать все статические файлы в кучу, определим для каждого типа файлов отдельные папки. В частности, создадим в папке static для изображений каталог images , а для стилей — каталог css . Подобным образом можно создавать папки и для других типов файлов.
В папку static/images добавим какое-нибудь изображение — в моем случае это будет файл forest.jpg . А в папке static/css определим новый файл styles.css , который будет иметь какие-нибудь простейшие стили, например:
body < font-family: Verdana;>h1 img

Теперь используем эти файлы в шаблоне. Для этого в начале файла шаблона необходимо определить инструкцию
При этом данный код должен идти после тега DOCTYPE.
Для определения пути к статическим файлам используются выражения типа
Так, пусть в приложении в папке templates определен шаблон index.html , который имеет следующий код:
" />Django на METANIT.COM Зимний лес
" alt="зимний лес" >

При запуске приложения шаблон index.html будет генерироваться в следующую веб-страницу, которая будет использовать изображение и применять стили:

Настройка путей к файлам
Если нас не устраивает хранение файлов в каталоге по умолчанию — каталоге static, либо мы хотим указать несколько папок, то мы можем в файле settings.py задать все необходимые каталоги с помощью переменной STATICFILES_DIRS , которая принимает список путей:
STATICFILES_DIRS = [ BASE_DIR / "static", "/var/www/static/", "/somefolder/" ]
Как подключить статику в django
![]()
Django База [2023]: Подключение статики и медиа в Django ️ #5
05 января 2023
Оценки статьи
Еще никто не оценил статью
В данной статье мы добавим пути к статическим файлам, а также настроим папку media для загрузки превью для наших статей в Django 4.1.
Если вы хотите выразить благодарность автору сайта, статей и курса по Django, вы можете сделать это по ссылке ниже:
Подключение статики и медиа
Для этого нам необходимо перейти в файл конфигурации Django: settings.py и добавить следующие параметры:
backend/settings.py
STATIC_URL = '/static/' STATIC_ROOT = (BASE_DIR / 'static') MEDIA_ROOT = (BASE_DIR / 'media') MEDIA_URL = '/media/'
Статические файлы из различных пакетов и из самого Django будут загружены в папку static, находясь в режиме деплоя, это когда параметр DEBUG = False .
Для работы media в режиме DEBUG = True нам необходимо добавить следующее в backend/urls.py
backend/urls.py
"""backend URL Configuration The `urlpatterns` list routes URLs to views. For more information please see: https://docs.djangoproject.com/en/4.1/topics/http/urls/ Examples: Function views 1. Add an import: from my_app import views 2. Add a URL to urlpatterns: path('', views.home, name='home') Class-based views 1. Add an import: from other_app.views import Home 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') Including another URLconf 1. Import the include() function: from django.urls import include, path 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) """ from django.contrib import admin from django.urls import path from django.conf.urls.static import static from django.conf import settings urlpatterns = [ path('admin/', admin.site.urls), ] if settings.DEBUG: urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
Сохраняем, и запускаем Django для проверки: py manage.py runserver , переходим в админ.панель и в нашу добавленную статью загружаем изображение:

Отлично, теперь мы можем загружать превью к нашим статьям. Но нам нужно кое-что улучшить, а именно разложить изображения по датам, чтобы мы могли знать, в какую дату было загружено изображение на наш сайт.
Поэтому внутри модели Article, в файле modules/blog/models.py я изменю поле thumbnail с этого:
blog/models.py
class Article(models.Model): """ Модель постов для сайта """ # Другие поля. thumbnail = models.ImageField( verbose_name='Превью поста', blank=True, upload_to='images/thumbnails/', validators=[FileExtensionValidator(allowed_extensions=('png', 'jpg', 'webp', 'jpeg', 'gif'))] )
blog/models.py
class Article(models.Model): """ Модель постов для сайта """ # Другие поля. thumbnail = models.ImageField( verbose_name='Превью поста', blank=True, upload_to='images/thumbnails/%Y/%m/%d/', validators=[FileExtensionValidator(allowed_extensions=('png', 'jpg', 'webp', 'jpeg', 'gif'))] )
Добавив /%Y/%m/%d/ , это обозначнает, что мы хотим сохранить изображение в по дате, например images/thumbnails/2023/01/05 .
Я удалю загруженное изображение и добавлю новое:

Мы ещё вернемся к работе с изображениями и напишем функцию, которая будет переименовывать изображения при загрузке, а также сделаем возможность оптимизации изображения с помощью пакета Pillow.
Обработка статических файлов (например, изображений, JavaScript, CSS) ¶
Веб-сайты обычно должны обслуживать дополнительные файлы, такие как изображения, JavaScript или CSS. В Django эти файлы называются «статическими файлами». Django предоставляет django.contrib.staticfiles помощь в этом управлении.
На этой странице рассказывается, как обслуживать эти статические файлы.
Настройка статических файлов ¶
- Убедитесь, что django.contrib.staticfiles это включено в вашу настройку INSTALLED_APPS .
- В вашем файле настроек определите STATIC_URL , например:
STATIC_URL = '/static/'
load static %> img src=" static "my_app/example.jpg" %>" alt="My image">
В дополнение к этим шагам настройки вам также потребуется обслуживать статические файлы.
Во время разработки, если вы используете 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 предоставляет удобную команду управления для сбора статических файлов в один каталог для упрощения обслуживания.
-
Задайте настройку STATIC_ROOT в соответствии с каталогом, из которого вы хотите обслуживать файлы, например:
STATIC_ROOT = "/var/www/example.com/static/"
$ python manage.py collectstatic
Узнать больше ¶
В этом документе описаны как основы, так и некоторые распространенные сценарии. Полную информацию обо всех настройках, командах, тегах шаблонов и других функциях django.contrib.staticfiles см. В справке по статическим файлам .