Почему джанго не видит css файл
У меня есть проект Django с несколькими приложениями. Я пытаюсь сделать некоторые страницы ошибок по умолчанию, например, для ошибок 400, 403, 404, 500. Я сделал это и отобразил соответствующие шаблоны, но без стилей или JS.
На странице ошибки 404 я пытаюсь создать ссылку на CSS из одного из приложений, чтобы применить правильный стиль, но в консоли я вижу эту ошибку:
Однако файл там существует.
Этот конкретный файл CSS находится в двух местах: в каталоге приложения и также находится в STATIC_ROOT, потому что я выполнил команду python manage.py collectstatic .
STATIC_URL установлен на /static/
Файл CSS находится по адресу:
Мой шаблон 404 находится по адресу:
Моя ссылка на CSS выглядит так:
URL моего проекта выглядит так:
Я пробовал много разных решений (например, избавился от комментариев в CSS или изменил тип ссылки HTML), но пока ничего не помогло.
Каков наилучший способ сделать это?
ИЗМЕНИТЬ ЧТОБЫ ДОБАВИТЬ: Моя страница 404.html выглядит так:
Файлы JS также дают ошибку 404, но я полагаю, как только я выясню причину проблем с CSS, я также смогу выяснить проблемы с JS. Файл error_base.html по сути представляет собой шаблонный HTML-файл с соответствующими блоками в соответствующих местах для блоков, перечисленных на странице 404.html.
ДОПОЛНИТЕЛЬНОЕ ИЗМЕНЕНИЕ ДЛЯ ДОБАВЛЕНИЯ:
Мои настройки статических файлов выглядят так:
ИЗМЕНИТЬ ЧТОБЫ ДОБАВИТЬ: Древовидная структура выглядит так:
3 ответа
Настройки:
settings.STATIC_ROOT и settings.MEDIA_ROOT должны быть названиями каталогов, содержащих ваши статические и мультимедийные файлы, не абсолютный путь к этим каталогам. Измените их на следующие:
Обновить
Как указано в комментариях, вы можете использовать manage.py runserver --insecure вместо написания пользовательской функции static .
Другая возможная причина - комментарий в начале файла css.
Обычно это означает, что страница не может найти ваш файл css и пытается загрузить вашу ненайденную страницу, которая является html.
Попробуйте использовать полный абсолютный путь для ссылки на странице ошибки и посмотрите, работает ли это:
Если это сработает, я бы в следующий раз проверил, что переменная static , которую заменяет Django, действительно установлена правильно во время выполнения. Я подозреваю, что путь немного отклонился.
Если это не сработает, попробуйте указать полный абсолютный путь к файлу css в папке приложения вместо STATIC_ROOT :
Если это сработает, а первое - нет, то я подозреваю, что проблема где-то в конфигурации / переводе, когда ваши файлы собираются в STATIC_ROOT . Я не знаком с процессом, поэтому я не уверен, что именно было перемещено, куда и какие метаданные были изменены, если таковые имеются. Я полагаю, что никто не делает, но единственный способ убедиться - это попробовать.
Похоже, ваш STATICFILES_DIRS не указывает на конечные папки, в которых на самом деле находятся файлы css. Заполните эти пути, и это может сработать (добавьте dist / static . и т. Д.)
Django-CMS отказывается видеть статические файлы в каталоге static проекта. Те что создаются вручную - просто не находит. А те что установливались вместе с django и django-cms по прежнему берутся из ../env/lib/python3.6/site-packages/cms/static/cms/
collectstatic сделал.
settings.py
Простой 2 комментария
1. Не видят на сервере под управлением Апача/Нджинкса или локально в девелоперско-тестовом режиме?
2. DEBUG стоит в режиме True или False?
1. Попробуй точно указать путь BASE_DIR. У меня сделано так:
2. В urls.py попробуй сделать так:
Т.е. напрямую свяжи с переменной (мб поможет, ну у меня лично так сделано, и так рекомендуют сами разработчики джанги)
3. Проверь наличие 'django.contrib.staticfiles' в переменной INSTALLED_APPS в settings.py
4. Так же проверь наличие переменной
5. Ну и самое главное, не забудь импортировать статику в шаблон)
Так же на это может повлиять веб-сервер, для того что бы это понять, попробуй загрузить статику на своем пк, если получится - надо настраивать веб-сервер.
Если не получится отпиши, будем дальше думать)
Проверил всё вышеперечисленное. Не помогло.
Довел urls.py до вот такого состояния:
print(settings.STATIC_ROOT) выдает путь к нужной мне папке (/home/. /blog/static
)
print(urlpatterns) - вот такое: [.*)$'>, .*)$'>] (вроде все ок)
И все равно: 127.0.0.1:8000/static/css/style.css - 404 (файл лежит в /home/. /dcms/blog/static/css/)
А 127.0.0.1:8000/static/cms/css/3.6.0/cms.base.css - ок (этот лежит в /home/. /dcms/env/lib/python3.6/site-packages/cms/static/cms/css/3.6.0/cms.base.css)
Это может быть связано с тем что я работаю в venv а не "на прямую"?
Shua_inc, для того что бы открывать по ссылке файлы тебе нужно прописать url для них.
Примерный код:
Или как вариант
но дебаг должен быть тру и не рекомендуется вообще так делать
Stormx480, Не помог ни первый, ни второй вариант :( Колдунство какое-то. Сейчас тупо начну все сначала. Настрою статику на голой Django, а потом добавлю Django CMS. Может пойму где грабли находятся
Shua_inc, папка static лежит в директории с файлом manage.py?
Скинь что написано в settings.py, urls.py, views.py под спойлер
I am still new to django and I am having problem with my CSS working.
I have followed the direction from the link: Django Static Link tutorial, on handling static files. But it is still not working.
Settings
Почему появляется ошибка:
Почему django не может найти файлы css:
Если вы посмотрите на исходный код функции static , которую вы вызываете в своем urls.py , он будет выглядеть примерно так:
Это означает, что re_path , который используется для рендеринга статических файлов, больше не существует, поскольку вы установили DEBUG=False для проверки своего 404.html шаблон .
Используйте это, чтобы создать свой urlpattern вместо встроенной функции django static :
Заявление об ограничении ответственности: это в основном та же функция, что и в django.conf.urls.static , без ограничения DEBUG=False .
10 Answers 10
For Django to serve static files, you have to make sure you have a couple of settings.
STATIC_URL
This setting specifies what url should static files map to under. You have that done already.
STATICFILES_DIRS
This specifies all the folders on your system where Django should look for static files. The idea is that you might have a couple of apps within your project, and each app might require a different set of static files. So for organizational purposes, each app might contain a static directory where it will store only it's static files. So then Django has to have a way to know where those directories are. This is what this setting is for.
STATIC_ROOT
This setting specifies where Django will copy all the static files to and not where the static files are already at. The idea is that once you leave development into production, Django can't serve static files anymore due to issues I will not go here (it's in the article). However for production, all static files should be in a single directory, instead of in many like specified in STATICFILES_DIRS . So this setting specifies a directory to which Django will copy all the static files from from all files within STATICFILES_DIRS by running the following command:
Please note this is only necessary once you go into production and also that the directory specified here cannot be the same as any directory specified in STATICFILES_DIRS .
Urls.py
In development for Django to serve your static files, you have to include the static urls in your urls.py:
Once you will complete all of the above things, your static files should be served as long as you have DEBUG = True . Out of the list above, you seem to only complete STATIC_URL . Also please note that all the steps I described above are in the docs you linked in your question (link). It might be a bit confusing in the beginning but if you read it a couple of times, it becomes clearer.
Чего только не пробовал(( И статические переменные менять и картинки из разных мест грузить(
Подскажите, что делать?
Установил версию 1.3. Проблема осталась((
Понятно что нехватает прав, я читать умею. А как сделать чтобы их хватало?
вошел, там по буржуйски. уменя с ни м проблемы( Еслиб спокйно читал на английском, давно бы офф-доки прочитал и сделал, раз пишу тут. значит нужна помощь на русском языке.
Мы с гуглем-транслейтом победили эту писанину. Проблема решена СПАСИБО!
Щас изложу ещё одну.
Картинки вставляю так:
Картинки лежат в папке "static", если указать background-image:url("/static/button_down.jpg"); - то все работает.
ZenRus вошел, там по буржуйски. уменя с ни м проблемы( Еслиб спокйно читал на английском, давно бы офф-доки прочитал и сделал, раз пишу тут. значит нужна помощь на русском языке.
Вы не расстраивайтесь так, мы всегда готовы почитать буржуйские доки за отдельную почасовую плату.
Кто ж его знает. Я делаю в шаблоне так:
А как сделать есть в CSS есть картинки? , например:
Я уже плюнул на попытки подгружать CSS как динамику, просто вставляю сразу в HTML.
И вообще, зачем нужны навороты с MEDIA_URL , если можно url("/static/button_up.jpg"); Или так у меня только на локальном тестовом сервере будет работать?
П.С. Вы же понимаете всю эту кухну, напишите нормальный развернутый ДОК на эту тему, такую кучу вопросов по данной теме в инете видел, и практически ни одного вразумительного ответа.
Вообще-то, в css используют относительыне ссылки, типа url("../img/button_up.jpg"). И не имеет значения, как подключается css-файл, главное чтобы папка img была на месте.
Вы же понимаете всю эту кухну, напишите нормальный развернутый ДОК на эту тему, такую кучу вопросов по данной теме в инете видел, и практически ни одного вразумительного ответа.
Написание нормального рецепта с примерами и ссылками занимает 4 часа, как минимум. С того времени, как на сайте появилась возможность добавлять рецепты пользователями - был добавлен только один. То есть, никто не хочет тратить свое время. Вот и нам писать статьи аля "как работает сайт для чайников" вообще нет никакого интереса - пытаемся писать или переводить что-то полезное для себя или то, что нельзя найти в гугле.
Можете разобраться как это все работает и доступно написать так, как вы бы поняли. И все будут вам благодарны.
ZenRus Вы же понимаете всю эту кухну, напишите нормальный развернутый ДОК на эту тему, такую кучу вопросов по данной теме в инете видел, и практически ни одного вразумительного ответа. Пытаюсь найти свою мотивацию, чтобы потратить свои четыре часа. Не находится Как разберётесь (там несложно), напишите рецепт для остальных.
Вообще-то, в css используют относительыне ссылки, типа url("../img/button_up.jpg"). И не имеет значения, как подключается css-файл, главное чтобы папка img была на месте. Да в HTML-е вообще все пути относительными можно сделать.
Насколько я понял, проьблема не в относительнисти линков, а втом что CSS и картинки это статика, и Джанго не может их просто взять по пути рядышком, а должен сформироваться запрос на загружку того или иного статического объекта, и результатом обработки такого запроса является как раз загрузка этого статика (Я это как-то так понимаю)
Если осилю приницпы, то обязательно напишу статью))
Django формирует html, а не запросы. Запросы формирует браузер. При использовании dev-server статику обычно отдают через 'django.views.static.serve'. Которую берет он из настроек: . Логика вот такая:
Тоесть в шаблоне будет >path_to_css_file/file.css. В django.views.static.serve попадет path_to_css_file/file.css. MEDIA_URL отрежется системой урлов. static.serve попытается найти файл по полученному пути в document_root, то есть settings.MEDIA_ROOT.
То есть у вас не верно т.к. вы указали для django.views.static.serve "search/", а не static/, который прописан в MEDIA_URL.
Огромное спасибо, пошел разбираться. Последний вопросик, раз тема в это русло пошла:
Мне нужно "выпустить мое приложение в мир", т.е. чтобы его было видно из глобала, как тут ПРОЩЕ поступить?
У меня уже стоит Apache 2.3 Python 2.7 Django 1.3.
Вопрос следующий: какой наиболее просто способ поднять свой Джанго-сервер чтобы он "светил" в глобал? И есть ли ге-нить русскоязычная докумнтация по шагам?
Здравствуйте! Помогите, пожалуйста, 3 часа уже парюсь.
Сейчас в settings.py у меня прописано:
Все варианты из инструкции по работе со статическими файлами я также перепробовал (STATICFILES_DIRS, STATIC_ROOT, STATICFILES_FINDERS, collectstatic). Ничего не помогает.
Смотрел в FireFox + FireBug. CSS файлы (base.css и login.css) с сервера загружаются - 2-а GET успешно отправляются, и сервер возвращает эти файлы. Но при просмотре содержимого файлов в FireBug отображается пустое содержимое.
В чём дело? Подскажите, пожалуйста.
А вы случайно не создавали в проекте папку admin?
А вы случайно не создавали в проекте папку admin?
Нет, папку admin в проекте не создавал. Создал лишь одно новое приложение с именем page. Таким образом, в проекте есть только папка page.
Вообще странно, облазил весь инет, такая проблема встречается, но лишь на реальных веб-серверах (apache, nginx). Почти у всех она успешно решается с помощью добавления инструкций в settings.py касательно статических файлов. Такое ощущение, что на встроенном в django локальном web-сервере у всех всё работает без проблем с дефолтовыми настройками.
Я учусь по достаточно свежей книге Дронова (Django: практика создания Web-сайтов на Python), так в ней автор тоже ничего не пишет о каких-то дополнительных настройках. Вероятно, всё должно сходу работать без проблем. Странно, похоже какой-то уникальный косяк именно у меня.
Да, DEBUG = True. На всякий случай ниже пишу все настройки settings.py
Добрый день. Решили проблему?
Внимательно читаем документацию, особенно часть, где описывается работа в отладочном режиме.
К сожалению, так и не решил.
Внимательно читаем документацию, особенно часть, где описывается работа в отладочном режиме.
Неоднократно перечитал и всё перепробовал, но ничего не получается. В settings.py добавил:
В urls.py добавил:
В корневой папке проекта лежит папка static со всеми статическими файлами для админки. Файлы сгенерированы с помощью утилиты collectstatic. В ней подпапка admin, в которой подпапки с содержимым для css, js, img. Но css при отображении страницы не применяются. Прикол в том, что они вроде бы грузятся. Отладочный сервер выводит инфу, что css admin/css/base.css загружен (200), но почему-то эти файлы либо не применяются либо оказываются пустыми. Перепробовал различные виды комбинаций настроек (включая те, что закомментированы). Ничего не помогает. Пробовал смотреть в разных браузерах - везде одно то же.
Вообще при DEBUG=True ничего не нужно в urls.py добавлять. Просто добавить в INSTALLED_APPS django.contrib.staticfiles . И статику собирать не нужно. Её собирают, чтобы раздавать на сервере.
Вообще при DEBUG=True ничего не нужно в urls.py добавлять. Просто добавить в INSTALLED_APPS django.contrib.staticfiles. И статику собирать не нужно. Её собирают, чтобы раздавать на сервере.
Действительно, в доке написано, что не нужно. Просто у меня не работают CSS при открытии страницы /admin/ в любых вариантах настроек. Поэтому и пробую уже всё, что угодно. В INSTALLED_APPS django.contrib.staticfiles есть, но в моём случае этого оказывается недостаточно. Интересно, кто-нибудь реально пробовал под windows отладочный сервер запустить и чтобы у него css для /admin/ подгружались? Может у меня просто какой-то оригинальный специфичный косяк, не связанный с django? Если такие есть - откликнитесь, пожалуйста.
Добрый день. Решили проблему?
Я запускал девсервер на винде 7, django 1.9 и python 3.4. Вам не нужно делать collectstatic, поэтому папки эти можете удалить. collectstatic нужен для сбора статики для боевого сервера. А у вас вообще странная ситуация, потому что все должно работать. Попробуйте сделать следующее. Укажите в настройках setings.py следующее:
Вот именно, что все должно работать. Проблема, мне кажется, в том как отдается статика.
Нет, не решил. Пробовал тоже и с новыми версиями (python 3.5.1 , django 1.9.6) - не работает. CSS файлы передаются (видно в FireBug), но почему-то не применяются.
Я запускал девсервер на винде 7, django 1.9 и python 3.4. Вам не нужно делать collectstatic, поэтому папки эти можете удалить. collectstatic нужен для сбора статики для боевого сервера. А у вас вообще странная ситуация, потому что все должно работать.
Попробуйте сделать следующее. Укажите в настройках setings.py следующее:
STATICFILES_DIRS = (
'прямой/путь/до/джанго/static',
)
STATICFILES_FINDERS = (
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
)
должно заработать.
А почему путь такой - 'прямой/путь/до/джанго/static'? В каталоге django нет папки static. Впрочем я попробовал разные варианты, включая такой такой путь . Также попробовал обновить версии Python (теперь 3.5.1) и django (теперь 1.9.6). Всё равно не работает. А вы когда на Windows 7 пробовали, Вы использовали 32-х разрядную версию инсталлятора Python или 64-х разрядную? Я использую 64-х. Это единственное, что я ещё не пробовал сделать.
Зачем убивать время на переустановку python и django? Что на них грешить-то? Практичней потратить это время на прочтение документации пока не осенит в чем дело.
Нет, не решил. Пробовал тоже и с новыми версиями (python 3.5.1 , django 1.9.6) - не работает. CSS файлы передаются (видно в FireBug), но почему-то не применяются.
Тут уж точно python и django не при чем. Они свою работу сделали. Шаблон отрендерен, CSS подгружен.
Под виндой можно геморой получать, а не питон изучать. Ставьте виртуалку с линуксом (убунтой) и будет вам счастье. Вся документация написана под юникс окружение.
Зачем убивать время на переустановку python и django? Что на них грешить-то? Практичней потратить это время на прочтение документации пока не осенит в чем дело.
Да, вроде, уже всё перечитал и перепробовал, поэтому это уже не катит. А переустановил, т.к. vadiq написал, что у него вся эта кухня работала с django 1.9. Кроме vadiq никто пока здесь не писал, что у него без проблем работал отладочный сервер под Win с css, поэтому я и решил на всякий случай синхронизировать версию django с ним.
Да, вроде, уже всё перечитал и перепробовал, поэтому это уже не катит.
Вот самый дельный совет, в этом случае, от urslan если хотите получить результат без геммороя -
Ставьте виртуалку с линуксом (убунтой) и будет вам счастье.
Тут и все сказано, что в основном все под NIX ами сидят.
Кроме vadiq никто пока здесь не писал, что у него без проблем работал отладочный сервер под Win с css
А почему путь такой - 'прямой/путь/до/джанго/static'? Я примерно указал, папка static находится как раз в site-packages/django/contrib/admin/static Но это как я понимаю не помогло.
А вы когда на Windows 7 пробовали, Вы использовали 32-х разрядную версию инсталлятора Python или 64-х разрядную? Тоже 64 разрядную. Проблема не в этом. В каком каталоге у Вас находится проект, т.е. сайт??
Смотрел в FireFox + FireBug. CSS файлы (base.css и login.css) с сервера загружаются - 2-а GET успешно отправляются, и сервер возвращает эти файлы. Но при просмотре содержимого файлов в FireBug отображается пустое содержимое. А Вы откройте эти файлы, вдруг они действительно пустые. Маловероятно, но возможно. Потому что у вас все должно работать.
Попробуйде в urls.py внести изменения: Измените url(r'^admin/', include(admin.site.urls)), на
если нужно выше добавьте
должно решить проблему.
Попробуйде в urls.py внести изменения:
Измените url(r'^admin/', include(admin.site.urls)),
на
url(r'^admin/', admin.site.urls),
если нужно выше добавьте
from django.contrib import admin
должно решить проблему.
После обновления django до 1.9.6 в urls.py у меня именно это и есть. В старой версии (1.8) было c include. Каталог с проектом был на рабочем столе, но для проверки я создал рабочий каталог с именем "zzz" в корне диска C. Результат тот же самый. Файлы base.css и login.css проверил, они не пустые. Дело в том что FireBug на вкладке сеть показывает два успешных запроса GET - для base.css и для login.css. При этом там же можно посмотреть содержимое ответа запроса (например, для base.css) - там именно то содержимое, которое лежит в файле C:\Users\Serg\Envs\djangostudy\Lib\site-packages\django\contrib\admin\static\admin\css\base.css. При этом, меняя содержимое файла на диске, я могу видеть, что содержимое ответа запроса GET тоже меняется. Но когда я в том же Firebug щёлкаю вкладку CSS, я вижу там два файла - base.css и login.css - щёлкаю по этим файлам - там пусто. Этот косяк у меня во всех браузерах и только с админкой django сайта. Ранее я такого не встречал. На всякий случай ещё раз публикую текущие варианты settings.py и urls.py (хотя я пробовал уже огромное количество других вариантов):
вставьте это вместо
Не факт, что решит проблему. Но я подозреваю, что у вас стили не доходят до html шаблона. т.е. в get запросе получаем инфу, а на самой странице она уже не отображается. Может проблема в базовом шаблоне админки? Нужно ковыряться и искать.
Если уже не помогает ничего, и вы именно на винде хотите мучаться, то уже попробуйте вручную организовать раздачу статики на дев-сервере при помощи django.contrib.staticfiles.views.serve(). Это альтернатива django.contrib.staticfiles. А вообще, рекомендую на линукс перейти. Там в разы удобнее и проще работать с django.
А в логах джанго что пишется?
Так в порядке бреда. Не через nginx тестовый сервер запросы принимает?
Поковырялся в очередной раз. Выяснил точную причину проблемы, но пока не знаю как эту проблему устранить. Вот причина: CSS - файлы (base.css и login.css) успешно приходят в браузер с сервера, но браузеры при отображении страницы используют не полученные css файлы, а свои системные (html.css и др.). Причину такого поведения браузеров мне помогли выяснить инструменты разработчика в Chrome (до этого я использовал только FireBug в FireFox). Они выдали предупреждение, которое FireBug не выдаёт. Скриншот предупреждения ниже:
Причина в том, что в HTTP заголовке ответа сервера в поле Content-Type указано "text/plain". Скриншот ниже: А должно быть указано "text/css". Ниже скриншот примера с обычного сайта: Т.е. теперь решение проблемы сводится к тому, чтобы правильно выставить Content-type в заголовке ответа для CSS. Кто-нибудь в курсе, как это можно сделать?
А что у вас в шаблоне страницы написано?
Вот вам для примера.
А что у вас в шаблоне страницы написано?
В шаблоне base.html админки написано всё как надо. Я это проверил. FireFox это подтверждает (скриншот итогового html в FireBug ниже:)
В порядке бреда (но часто достает в Винде) кодировка файлов СSS отличается от UTF8?
В порядке бреда (но часто достает в Винде) кодировка файлов СSS отличается от UTF8?
Нет, как я понимаю, в отличие от html для CSS файлов кодировка не указывается, т.к. она не играет значения. В css используются только ASCII символы, а они в любой кодировке имеют одинаковые значения. Моя проблема в интернете уже не раз обсуждалась, но правильного решения почти никто не предлагал. Нашёл одного человека на одном форуме, который для себя эту проблему решил. Вот чего он написал:
В моей версии django уже всё поменялось, поэтому это решение уже не актуально, тем более, что оно весьма корявое. Я предполагаю, что это, возможно, косяк какой-то библиотеки в составе Python под Windows нежели косяк django. В документации по django 1.9 в разделе, посвящённому static файлам, есть такой текст:
text/css - это один из допустимых MIME типов. Как я понимаю, здесь речь идёт примерно о том, что если возвращаемые content-types для некоторых файлов не являются верными, то надо смотреть "platform's map files". Причём, проблема, вероятнее всего, не в файлах платформы, а в коде модуля Python, который эти файлы грузит. Возможно, какая-то проблема в модуле Lib/mimetypes.py в составе Python (описание модуля). В нём есть функция read_windows_registry, которая грузит из реестра Windows все MIME типы. Думаю, что для решения проблемы копать нужно в эту сторону. Но т.к. я в django и в Python я пока толком не рублю (всё это я затеял как раз для изучения связки Python и Django), то для меня это слишком сложная задача и поэтому, наверное, действительно будет проще развернуть всю эту кухню под каким-нибудь Linux сервером (как советует некоторые участники обсуждения).
index.html
And directory organization
Thank you so much, your help and time is much appreciated!
'What' is not working? How do you render your views, using render() or render_to_response()? Is static files context processor turned on in settings.py?
Yes I am using render_to_response, I will update it with my view. It's not working by the css is not actually changing my html.
@OtskimanotSqilal Thank you for the reply, I just updated it with my STATICFILES_DIR, my css is still not showing up.
The way you configured STATICFILES_DIRS and STATIC_ROOT is incorrect. They cannot contain the same directories. Please refer to my answer for more info.
Читайте также: