Статика в Django runserver
В комплект с Django входит свой веб-сервер. Запускается он командой:
$ python3 manage.py runserver
После запуска сайт будет доступен по адресу http://127.0.0.1:8000. Для лучшего понимания текста, написанного ниже, рекомендуем прочитать статью Что такое веб-сервер.
Веб-сервер runserver
называют отладочным. Для “боевых” условий он решительно не годится, об этом ясно указано в документации, но зато он чрезвычайно удобен в разработке и отладке. runserver
берёт на себя все обязанности сразу: и HTML генерирует, и статику отдает, и даже с медиа работает, если его научить.
Чтобы получить от runserver
файлы статики, нужно знать их адрес. Поведением сервера управляет настройка с названием STATIC_URL
в файле settings.py
. Если указано STATIC_URL = '/assets/'
, то браузер может получить файлы статики по адресу вида http://127.0.0.1:8000/assets/logo.png
.
С путями к файлам статики всё несколько хитрее. В статье про веб-серверы упоминался STATIC_ROOT
— это путь к каталогу, в котором веб-сервер ищет файлы статики. В файле settings.py
есть настройка с таким названием STATIC_ROOT
, и она влияет на работу веб-сервера в “боевом” режиме. А вот в отладочном режиме Django использует иной механизм. Так как файлов статики в больших проектах бывает много, то и хранить их удобнее не в одном каталоге STATIC_ROOT
, а распределив по нескольким. Когда runserver
получает запрос на очередной файл статики, то искать его он будет во всех каталогах, указанных в настройке STATICFILES_DIRS
того же файла settings.py
.
Для примера рассмотрим сайт Django с такими настройками в settings.py
:
...
STATIC_URL = '/assets/'
STATICFILES_DIRS = [
'/home/site/static/',
'/home/site/project/markup/',
'/home/site/common/css/',
]
Если запустить отладочный веб-сервер runserver
, то на запросы он будет реагировать так:
http://127.0.0.1:8000/assets/style.css
Адрес начинается с префикса, указанного в STATIC_URL
— /assets/
, значит, это файл статики. Веб-сервер по очереди проверит каждый из каталогов в списке STATICFILES_DIRS
, там будет искать файл style.css
. Когда найдет — отправит файл браузеру.
http://127.0.0.1:8000/assets/imgs/logo.png
Снова адрес начинается с /assets/
, значит, веб-сервер будет искать файл статики imgs/logo.png
в одном из каталогов STATICFILES_DIRS
.
http://127.0.0.1:8000/static/photo.png
Префикс адреса /static/
не совпадает со значением STATIC_URL = '/assets/'
. Веб-сервер решит, что запрос относится к динамической части сайта, и попробует найти обработчик среди Python кода сайта. Скорее всего он ничего не найдет и вернет 404 Page not found.
Как подключить статику
Чтобы подключить файлы статики к Django вам достаточно выяснить две вещи: куда класть файлы и по какому адресу их получит браузер. Управляют этим две настройки STATIC_URL
и STATICFILES_DIRS
, обе живут в файле settings.py
.
Отладочные print
Самый простой способ выяснить значение настроек — добавить отладочные print
в конец файла settings.py
:
print('STATIC_URL', STATIC_URL)
print('STATICFILES_DIRS', STATICFILES_DIRS)
Теперь запустите в консоли любую команду с manage.py
, например runserver
, и увидите значение настроек:
$ python3 manage.py runserver
...
STATIC_URL /assets/
STATICFILES_DIRS ['/home/user/site/assets/']
Django Debug Toolbar
В больших проектах часто используют усложненные механизмы конфигурации и тогда простой способ с print
может дать осечку.
Но если на сайте установлено приложение Django Debug Toolbar, то у вас появляется второй вариант. Debug Toolbar это панель c отладочной информацией. Изначально панель свёрнута и отображается в виде небольшой сноски у правого края браузера. Развернув панель вы обнаружите несколько вкладок, вам понадобятся Settings
и Static files
:
Полезные ссылки
Если вы хотите ближе познакомиться с Django и разобраться во всех деталях, то начните погружение с этих статей:
Попробуйте бесплатные уроки по Python
Получите крутое код-ревью от практикующих программистов с разбором ошибок и рекомендациями, на что обратить внимание — бесплатно.
Переходите на страницу учебных модулей «Девмана» и выбирайте тему.