revision-up-to: | 8961 (1.0) |
---|
Django 自体では、画像やスタイルシート、ビデオといった静的な (メディア) ファ イルを提供しません。通常、 Django はメディアファイルの提供を使っている Web サーバの仕事として残しておきます。なぜなら、 Apache や lighttpd のような 標準的な Web サーバは Web アプリケーションフレームワークよりもはるかに高 性能な静的ファイル提供機能を備えているからです。
というわけで、 Django が静的ファイルをサポートするのは 開発中だけ です。 メディアファイルの提供には django.views.static.serve() ビューを使って 下さい。
この方法は 非効率的 かつ 安全ではありません 。運用環境では使わず、 開発環境だけで使って下さい。
運用環境における静的ファイルの提供方法は、 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 では:
オプションとして、 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 31, 2012