Ссылка на изображение в 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/

Что очень странно, так как этот относительный путь должен был ссылаться static/css/ папка вместо main.css, Поэтому я попытался изменить путь, чтобы быть url('../img/btn_white.gif')и это работает в Chrome и Firefox, но не в IE.

Я почти уверен, что эта проблема связана с Django, потому что в моем чистом HTML/CSS этот относительный путь работает просто отлично. Я также попытался поместить css в папку media, и проблема та же.

Мои настройки, связанные со статическим приложением:

в settings.py:

STATIC_ROOT = os.path.join(os.path.dirname(__file__),'static').replace('\\','/')
STATIC_URL = 'http://localhost/mysite/static/'

в 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 по умолчанию True)

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()
Другие вопросы по тегам