Ссылка на изображение в CSS с относительным путем не работает в Django
Я использую Django 1.3 со встроенным статическим приложением.
моя статическая структура папок выглядит так:
static/
css/
main.css
img/
js/
поэтому я попытался ссылаться на изображения под static/css/img/
папка из CSS, как это:
background:url('img/btn_white.gif') repeat-x;
но изображения не появляются. Когда я проверяю элементы в Chrome, я нашел путь к изображению http://localhost/mysite/static/css/main.css/img/btn_white.gif/
что очень странно, так как этот относительный путь должен был ссылаться вместо main.css
. Поэтому я попытался измениться. путь url('../img/btn_white.gif')
, и он работает в Chrome и Firefox, но не в IE.
Я уверен, что эта проблема связана с Django, потому что в моем чистом HTML/CSS этот относительный путь работает отлично. Я также попытался поместить css в папку media, и проблема та же.
Мои настройки, связанные со статическим приложением:
in settings.py:
STATIC_ROOT = os.path.join(os.path.dirname(__file__),'static').replace('','/')
STATIC_URL = 'http://localhost/mysite/static/'
in urls.py:
(r'^static/(?P<path>.*)/$', 'django.views.static.serve', {'document_root': settings.STATIC_ROOT}),
вопрос: относительный путь в CSS-файле относительный в файл CSS?
1 ответов
проблема вызвана вашим URLconf, в частности шаблоном:
r'^static/(?P<path>.*)/$'
это означает, что URL должны конец в косой черте, чтобы он соответствовал этому шаблону. т. е. следующий URL не будет соответствовать: (потому что у него нет косой черты)
/mysite/static/css/main.css
самое странное, что он тут работа. Причина этого-Джанго APPEND_SLASH
установка:
когда установите значение True, если URL-адрес запроса не соответствует ни одному из шаблонов в URLconf и не заканчивается косой чертой, http-перенаправление выдается на тот же URL-адрес с добавленной косой чертой. Обратите внимание, что перенаправление может привести к потере любых данных, представленных в запросе POST.
поэтому, когда ваш браузер делает запрос:
/mysite/static/css/main.css
...Django не сможет сопоставить его с любым из URL-адресов и выдаст перенаправление на: (Потому что APPEND_SLASH
по умолчанию Правда)
mysite/static/css/main.css/
этот новый запрос будет успешным, и ваш браузер теперь сможет загрузить файл CSS, однако URL-адрес ресурса файла CSS теперь заканчивается косой чертой. Когда ваш браузер обрабатывает правила CSS и сталкивается:
background:url('img/btn_white.gif') repeat-x;
он попытается присоединить этот относительный URI к URI ресурса CSS. например:
/mysite/static/css/main.css/ + img/btn_white.gif = /mysite/static/css/main.css/img/btn_white.gif
это не удастся, поэтому ваш браузер получит перенаправление на: (Снова из-за APPEND_SLASH
)
/mysite/static/css/main.css/img/btn_white.gif/
но, очевидно, это тоже не удастся.
решений
измените шаблон URL на следующий: (обратите внимание на удаленный трейлинг /
в шаблоне)
(r'^static/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.STATIC_ROOT}),
from django.conf import settings
if settings.DEBUG:
urlpatterns += patterns('django.contrib.staticfiles.views',
url(r'^static/(?P<path>.*)$', 'serve'),
)
...или вот:
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
# ... the rest of your URLconf here ...
urlpatterns += staticfiles_urlpatterns()