Django v1.0 documentation

静的なファイルの提供方法

revision-up-to:8961 (1.0)

Django 自体では、画像やスタイルシート、ビデオといった静的な (メディア) ファ イルを提供しません。通常、 Django はメディアファイルの提供を使っている Web サーバの仕事として残しておきます。なぜなら、 Apachelighttpd のような 標準的な Web サーバは Web アプリケーションフレームワークよりもはるかに高 性能な静的ファイル提供機能を備えているからです。

というわけで、 Django が静的ファイルをサポートするのは 開発中だけ です。 メディアファイルの提供には django.views.static.serve() ビューを使って 下さい。

大事な、大事な注意書き

この方法は 非効率的 かつ 安全ではありません 。運用環境では使わず、 開発環境だけで使って下さい。

運用環境における静的ファイルの提供方法は、 Django mod_python ドキュメント を参照してくだ さい。

方法

serve() ビューの定義を以下に示します。

def serve(request, path, document_root, show_indexes=False):

このビューを使うには、 URLconf に以下の設定を入れ ます:

(r'^site_media/(?P<path>.*)$', 'django.views.static.serve',
 {'document_root': '/path/to/media'}),

site_media はメディアファイル置場のルートの URL にします。 /path/to/media はメディアファイル置場のルートのファイルシステム上の場所 です。これで、 serve() が呼び出されるときに必須 のパラメタ document_root が渡されます。

ファイルシステムのルートを指定するため、必ず document_root パラメタを指 定せねばなりません。

上の URLconf では:

  • /path/to/media/foo.jpg というファイルは /site_media/foo.jpg という URL でアクセスできるようになります。
  • /path/to/media/css/mystyles.css というファイルの URL は /site_media/css/mystyles.css になります。
  • /path/bar.jpg というファイルはドキュメントルート下にないのでアク セスできません。

ディレクトリのリスト表示

オプションとして、 show_indexes パラメタを serve() ビューに渡せます。デフォルトの値は False です。 True にすると、Django はディレクトリに対して内容リスト を表示します。

例:

(r'^site_media/(?P<path>.*)$', 'django.views.static.serve',
 {'document_root': '/path/to/media', 'show_indexes': True}),

static/directory_index.html テンプレートを変更すれば、 index ビューをカ スタマイズできます。このテンプレートのコンテキストには二つのオブジェクトが 入っています:

  • directory -- ディレクトリ名 (文字列) です。
  • file_list -- ディレクトリ中のファイル名 (文字列) です。

デフォルトの static/directory_index.html テンプレートを示します:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
    <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
    <meta http-equiv="Content-Language" content="en-us" />
    <meta name="robots" content="NONE,NOARCHIVE" />
    <title>Index of {{ directory }}</title>
</head>
<body>
    <h1>Index of {{ directory }}</h1>
    <ul>
    {% for f in file_list %}
    <li><a href="{{ f }}">{{ f }}</a></li>
    {% endfor %}
    </ul>
</body>
</html>

DEBUG=True の時だけに制限する

URLconf は単なる Python モジュールに過ぎないので、静的メディアビューを開発 モードでしか使えないような Python ロジックを埋め込んでおけます。これは、うっ かり間違えて運用設定に静的ファイル提供ビューが紛れ込まないようにするのに便 利です。

以下のように if DEBUG 文でラップして django.views.static.serve() を取り込みます。 URLconf の例を示します:

from django.conf.urls.defaults import *
from django.conf import settings

urlpatterns = patterns('',
    (r'^articles/2003/$', 'news.views.special_case_2003'),
    (r'^articles/(?P<year>\d{4})/$', 'news.views.year_archive'),
    (r'^articles/(?P<year>\d{4})/(?P<month>\d{2})/$',
     'news.views.month_archive'),
    (r'^articles/(?P<year>\d{4})/(?P<month>\d{2})/(?P<day>\d+)/$',
     'news.views.article_detail'),
)

if settings.DEBUG:
    urlpatterns += patterns('',
        (r'^site_media/(?P<path>.*)$', 'django.views.static.serve',
         {'document_root': '/path/to/media'}),
    )

コードは一目瞭然で、設定を import して、 DEBUG の値をチェックし ています。値が True なら、 site_mediadjango.views.static.serve() ビューに関連づけられます。そうでない (DEBUG == False) なら、ビューを使えなくなります。

もちろん、運用設定の設定ファイルでは忘れずに DEBUG=False を設定しておく という前提が必要ですが、何にせよ運用環境では DEBUG=False を設定すべきで す。