@Baoo

Почему не подгружаются статические файлы в режиме разработки?

Если запускаю dev-контейнер с приложение Django, то не подгружаются статические файлы, хотя они точно есть в папке внутри контейнера.

# settings.py

DEBUG = True

STATIC_URL = 'static/'
STATIC_ROOT = BASE_DIR / 'static'


Если добавить
STATICFILES_DIRS = [
    BASE_DIR / 'static'
]

то будет ошибка из-за того, что STATIC_ROOT и STATICFILES_DIRS не могут совпадать.

Замена на DEBUG = False ничего не даёт.
Если запустить prod-версию с nginx и uwsgi, то всё работает на этих же настройках.
Прочитал, что нужно использовать две разные директории для статических файлов dev и prod, но подумал, что нелогично использовать 2 разные директории для одних и тех же файлов.
  • Вопрос задан
  • 102 просмотра
Решения вопроса 2
AlexNest
@AlexNest
Работаю с Python/Django
Почему не подгружаются статические файлы в режиме разработки?

Потому-что у джанги нужно отдельно обрабатывать пути до статики в dev-режиме
(вообще странно, что вы добрались до докера и прода, но не знаете про такие базовые вещи)
upd.
Для задания путей во время разработки нужно указывать:
STATICFILES_DIRS = [
    BASE_DIR / 'static'
]

Именно из папок, указанных здесь, будет подтягиваться статика.
STATIC_ROOT = BASE_DIR / 'static'
Указывает, куда собрать все файлы из папок, заданных в STATICFILES_DIRS.
Ответ написан
Комментировать
syschel
@syschel
freelance/python/django/backend
Почему не подгружаются статические файлы в режиме разработки?
Потому-что в режиме runserver, джанго отдаёт статику из папок(их несколько может быть) указанных в константе STATICFILES_DIRS. И работает это в режиме дебага. То есть когда у вас DEBUG = True.
На продакшене же, на рабочем сервере, у вас во первых должен быть включён DEBUG = False. А пути до статики вы указываете не в самой джанге, а в вашем nginx/apache веб-сервере. И там хоть какой путь может быть, хоть даже не в папке проекта. Главное указать в настройках веб-сервера, слушать путь который вы указали в константе STATIC_URL. Ибо джанго будет отдавать пути до файлов в ответах сервера, которые вы указываете в константах MEDIA_URL и STATIC_URL.

Выше вам подсказал Александр, для чего нужны эти две папки. Для выполнения консольной команды collectstatic, после которой вся статика из STATICFILES_DIRS, самой джангой соберётся и переместится в папку STATIC_ROOT. По этому и ругается, что дескать "папка разработки" и "папка итоговой сборки", не может быть одной и той же.

Как вариант, костыльный, если вы всё-равно не используете collectstatic, для сборки статики, то можете в settings.py, закомментировать строку с STATIC_ROOT или STATICFILES_DIRS. А в файл urls.py, добавить строки:

from django.conf import settings
from django.conf.urls.static import static

if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
    urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

Но это, имхо, именно костыль.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Baoo Автор вопроса
Спасибо за ответы
А такой вариант допустим?
STATIC_URL = 'static/'
if DEBUG:
    STATICFILES_DIRS = [BASE_DIR /'static']
else:
    STATIC_ROOT = BASE_DIR / 'static'
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы