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