Статика в 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 и разобраться во всех деталях, то начните погружение с этих статей: