静的なファイルの提供方法
| revision-up-to: | 5640 (0.97pre SVN) |
|---|
Django 自体では,画像やスタイルシート,ビデオといった静的な (メディア) ファ イルを提供しません.通常, Django はメディアファイルの提供を使っている Web サーバの仕事として残しておきます.なぜなら, Apache や lighttpd のような 標準的な Web サーバは Web アプリケーションフレームワークよりもはるかに高 性能な静的ファイル提供機能を備えているからです.
というわけで, Django が静的ファイルをサポートするのは 開発中だけ です. メディアファイルの提供には django.views.static.serve ビューを使って下さ い.
大事な,大事な注意書き
この方法は 非効率的 かつ 安全ではありません .運用環境では使わず, 開発環境だけで使って下さい.
運用環境における静的ファイルの提供方法は, Django mod_python ドキュメント を参照してください.
方法
URLconf に以下の設定を入れます:
(r'^site_media/(?P<path>.*)$', 'django.views.static.serve',
{'document_root': '/path/to/media'}),
site_media はメディアファイル置場のルートの URL にします. /path/to/media はメディアファイル置場のルートのファイルシステム上の場所 です.
ファイルシステムのルートを指定するため,必ず document_root パラメタを指 定せねばなりません.
例:
- /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 パラメタを static.serve ビューに 渡せます.デフォルトの値は False になっています. True にすると, Django はディレクトリに対して内容リストを表示します.
例:
(r'^site_media/(?P<path>.*)$', 'django.views.static.serve',
{'document_root': '/path/to/media', 'show_indexes': True}),
static/directory_index テンプレートを変更すれば, index ビューをカスタ マイズできます.このテンプレートのコンテキストには二つのオブジェクトが入っ ています:
- directory -- ディレクトリ名 (文字列) です.
- file_list -- ディレクトリ中のファイル名 (文字列) です.
デフォルトの static/directory_index テンプレートを示します:
<!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_media は django.views.static.serve ビューに関連づけられます.そうでない (DEBUG == False) なら,ビューを使 えなくなります.
もちろん,運用設定の設定ファイルでは忘れずに DEBUG=False を設定しておく という前提が必要ですが,何にせよ運用環境では DEBUG=False を設定すべきで す.