8

組み込みの静的アプリで 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 では機能しません。

私の純粋な HTML/CSS では、この相対パスは問題なく機能するため、この問題は Django に関連していると確信しています。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 ファイルに対して相対的ですか?

4

1 に答える 1

9

この問題は、URLconf、具体的には次のパターンによって引き起こされます。

r'^static/(?P<path>.*)/$'

これは、URLがこのパターンに一致するにはスラッシュで終わる必要があることを意味します。つまり、次の URLは一致しません: (末尾にスラッシュがないため)

/mysite/static/css/main.css

奇妙なことは、それ機能するということです。この理由は、Django のAPPEND_SLASH設定です。

True に設定すると、リクエスト URL が URLconf のどのパターンにも一致せず、スラッシュで終わっていない場合、HTTP リダイレクトが同じ URL にスラッシュが追加されて発行されます。リダイレクトにより、POST リクエストで送信されたデータが失われる可能性があることに注意してください。

したがって、ブラウザがリクエストを行うと、次のようになります。

/mysite/static/css/main.css

…Django はそれをどの URL とも照合できず、次へのリダイレクトを発行します: (APPEND_SLASHデフォルトが True であるため)

mysite/static/css/main.css/

この新しいリクエストは成功し、ブラウザは CSS ファイルをダウンロードできるようになりますが、CSS ファイルのリソース URL はスラッシュで終わります。ブラウザが CSS ルールを処理し、以下に遭遇すると:

background:url('img/btn_white.gif') repeat-x;

その相対 URI を CSS リソースの URI に結合しようとします。例えば:

/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()
于 2011-06-12T21:31:00.453 に答える