| revision-up-to: | 11321 (1.1) unfinished |
|---|
Django には、基本的に画像やスタイルシート、ビデオといった静的な (メディア) ファイルの提供を行わず、Web に任せます。なぜなら、 Apache や lighttpd 、 Cherokee のような標準的な Web サーバには、 Web アプリケーションフレームワー クよりもはるかに高性能な静的ファイル提供機能があるからです。
というわけで、 Django が静的ファイルをサポートするのは 開発中だけ です。 どうしてもメディアファイルを提供したければ django.views.static.serve() ビューを使って下さい。
参考
管理サイト用のメディアファイルを特定の場所に置いて提供したいだけなら、 runserver の --adminmedia パラメタを使ってくだ さい。
この方法は 非効率的 かつ 安全ではありません 。運用環境では使わず、 開発環境だけで使って下さい。
運用環境で静的ファイルを提供する方法を知りたければ、 Django mod_python ドキュメント を参照してくだ さい。
serve() ビューの定義は以下のようになっています。
このビューを使うには、 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 では:
もちろん、 'document_root' には必ずしも固定の文字列を入れる必要はありま せん。すべてを設定ファイル上の値で制御したいような場合もあるでしょう。そう すれば、このコードを使うユーザが必要に応じて簡単に設定値を変更できるからで す。例えば、 settings.py に以下のように書いておいたとします:
STATIC_DOC_ROOT = '/path/to/media'
こうしておけば、 URLconf は、以下のように書けます:
from django.conf import settings
...
(r'^site_media/(?P<path>.*)$', 'django.views.static.serve',
{'document_root': settings.STATIC_DOC_ROOT}),
ADMIN_MEDIA_PREFIX (デフォルト値は /media/) と同じ値を使わな いように注意しましょう。 ADMIN_MEDIA_PREFIX の設定値は URLconf のエントリをオーバライドする形で適用されるからです。
オプションとして、 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 ビューをカ スタマイズできます。このテンプレートのコンテキストには二つのオブジェクトが 入っています:
デフォルトの 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>
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_media は django.views.static.serve() ビューに関連づけられます。そうでない (DEBUG == False) なら、ビューを使えなくなります。
もちろん、運用設定の設定ファイルでは忘れずに DEBUG=False を設定しておく という前提が必要ですが、何にせよ運用環境では DEBUG=False を設定すべきで す。
Aug 19, 2010