Как подключить статику в django
Перейти к содержимому

Как подключить статику в django

  • автор:

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

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

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

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

  1. Убедитесь, что django.contrib.staticfiles включено в ваше INSTALLED_APPS .
  2. В файле настроек определите 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', ]

Настройка статических файлов в файле settings.py в проекте на Django

Переменная STATIC_URL имеет значение «static/», а это значит, что нам достаточно создать в папке приложения каталог с именем «static» и добавить в него необходимые нам статические файлы. Но, естественно, при необходимости через данную настройку мы можем изменить расположение каталога статических файлов.

Итак, добавим в папку приложения новый каталог static . Чтобы не сваливать все статические файлы в кучу, определим для каждого типа файлов отдельные папки. В частности, создадим в папке static для изображений каталог images , а для стилей — каталог css . Подобным образом можно создавать папки и для других типов файлов.

В папку static/images добавим какое-нибудь изображение — в моем случае это будет файл forest.jpg . А в папке static/css определим новый файл styles.css , который будет иметь какие-нибудь простейшие стили, например:

body < font-family: Verdana;>h1 img

Статчиеские файлы в проекте на Django

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

При этом данный код должен идти после тега DOCTYPE.

Для определения пути к статическим файлам используются выражения типа

Так, пусть в приложении в папке templates определен шаблон index.html , который имеет следующий код:

     " /> Django на METANIT.COM  

Зимний лес

" alt="зимний лес" >

Работа со статическими файлами в веб-приложении на Django

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

подключение статических файлов в приложении на Django и Python

Настройка путей к файлам

Если нас не устраивает хранение файлов в каталоге по умолчанию — каталоге static, либо мы хотим указать несколько папок, то мы можем в файле settings.py задать все необходимые каталоги с помощью переменной STATICFILES_DIRS , которая принимает список путей:

STATICFILES_DIRS = [ BASE_DIR / "static", "/var/www/static/", "/somefolder/" ]

Как подключить статику в django

Django База [2023]: Подключение статики и медиа в Django ��️ #5

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 помощь в этом управлении.

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

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

  1. Убедитесь, что django.contrib.staticfiles это включено в вашу настройку INSTALLED_APPS .
  2. В вашем файле настроек определите 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 см. В справке по статическим файлам .

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *