2011-07-04 10 views
2

私はちょうど古いDjangoプロジェクトを移行してstaticfilesアプリケーションを利用しました。それ以前には、サーバルートの直下で直接処理された静的ディレクトリにファイルが必要でした。このディレクトリはSTATIC_URLで提供されていますが、サーバルートの下で直接提供されるファイルを除いて問題ありません。サーバールートの下で直接処理する必要がある静的ファイルをどこに置くか?

私はルートからファイルを直接提供する方法を知っています(/favicon.icoや/robots.txtなど)。どこに置くべきですか? STATIC_ROOTの下のどこにでも置くと、2つのURL(/file.txtや/static/foobar/file.txtなど)が表示されますが、これは適切ではありません。

アイデア?

答えて

2

静的にウェブサーバーをリダイレクトして/static/favicon.icoから/favicon.icoにリダイレクトしてください。

より完全に答えるために:あなたはファイルfavicon.icoを持っている場合、これは静的なファイルである

をそのようにはSTATIC_ROOTの内部に存在する必要があります。ただし、このファイルは通常のルールの例外であり、そのファイルが/static/favicon.icoに存在しないようにするには、/favicon.icoに存在します。これはルールの例外であるため、このファイルの特別なルールをWebサーバー構成に追加するだけで、/favicon.icoにも配信されます。

ここでは、同じリソースが2つの異なるURLによって提供されていますが、それは悪いことです。ファイルを配信するためのルールを追加してから/になったので、これを正規のURLとみなして/static/favicon.ico/favicon.icoにリダイレクトするようにウェブサーバーに指示します。これで、同じリソースが1つの場所から提供されました。ルールにあなたがfavicon.icoためのWebサーバでセットアップ、あなたはので、あなたが提供したい、このファイルの異例な性質(および他のファイルのfavicon.icoを指定したため/static/のルートで

他のファイルは、この影響を受けません/)。

+0

のでリダイレクトがでキックのだろうか? 回避策が必要ない解決策はありませんか? そして、STATIC_ROOTに直接移動する必要のあるファイルはどこに置くのですか? – Semmel

+0

更新された回答を参照してください。 –

+0

私は参照してください - canoncial URLへのリダイレクトは、唯一の方法であるようです。 STATIC_ROOTに直接何かを置くことができましたか?それは空ではないはずですか? 'manage.py collectstatic'だけで満たされますか? – Semmel

10

私はurl.py内の両方の問題(favicon.ico、robots.txt)を解決しましたが、いくつかの違いがあります。 最初に、ビューにrender_to_responseを実行させると思われる解決策が嫌いです。

EDIT:Django 1.5からdirect_to_templateとredirect_toは廃止されました。これで、クラスベースのビューを使用できます。 Djangoの1.5については

robots.txtのために、あなたのurlpatternsに次の行を追加します。私は、ジェネリッククラスビューTemplateViewを使用して、(ロボットを使用するテンプレートを指定

from django.views.generic.base import RedirectView, TemplateView 

(r'^robots\.txt$', TemplateView.as_view(template_name="robots.txt", 
             content_type='text/plain')), 

をテンプレートディレクトリにある.txt)、およびMIMEタイプ。 favicon.icoをするために

、あなたのurlpatternsに次の行を追加します

(r'^favicon\.ico$', RedirectView.as_view(
          url=settings.STATIC_URL + 'img/favicon.ico')), 

をこれはSTATIC_URL +のIMG/favicon.icoをする/favicon.icoをリダイレクトします(例:/static/img/favicon.ico) favicon.icoはあなたの静的ディレクトリになければなりません。

これらの手法は、あらゆるメディアまたはHTMLコンテンツに使用できます。あなたがを使用することができますDjangoの以前のバージョンについては

:ファイルが提供される前に

(r'^robots\.txt$', direct_to_template, {'template': 'robots.txt', 
'mimetype': 'text/plain'}), 

(r'^favicon\.ico$', redirect_to, 
{'url': settings.STATIC_URL + 'img/favicon.ico'}), 
+1

基盤robots.txtを定位置に置くより簡単な方法は、HttpResponseを直接返すことです。私。 'url(r '^ robots \ .txt $'、lambda:HttpResponse(" User-agent:* \ nDisallow: "、mimetype =" text/plain "))、 ' – tijs

+0

ありがとうございます。このアプローチの唯一の問題は、静的ファイルが別のサーバー(たとえばnginx)によって提供される運用環境では、これらの例外が準最適であるwsgiサーバー(たとえばuwsgi)によって処理されることです。 – donturner

+0

これは、静的サーバー構成にルールを追加することで解決できます。 nginxの場合、これは次のようになります: '' location /robots.txt { \t別名/webapps/mywebsite/templates/robots.txt; } ' – donturner

関連する問題