.. _howto-static-files: ======================== 静的なファイルの提供方法 ======================== :revision-up-to: 8961 (1.0) .. module:: django.views.static :synopsis: 開発時に静的なファイルを提供するためのモジュールです。 Django 自体では、画像やスタイルシート、ビデオといった静的な (メディア) ファ イルを提供しません。通常、 Django はメディアファイルの提供を使っている Web サーバの仕事として残しておきます。なぜなら、 Apache_ や lighttpd_ のような 標準的な Web サーバは Web アプリケーションフレームワークよりもはるかに高 性能な静的ファイル提供機能を備えているからです。 というわけで、 Django が静的ファイルをサポートするのは **開発中だけ** です。 メディアファイルの提供には :func:`django.views.static.serve` ビューを使って 下さい。 .. _Apache: http://httpd.apache.org/ .. _lighttpd: http://www.lighttpd.net/ .. _The big, fat disclaimer: 大事な、大事な注意書き ====================== この方法は **非効率的** かつ **安全ではありません** 。運用環境では使わず、 開発環境だけで使って下さい。 運用環境における静的ファイルの提供方法は、 :ref:`Django mod_python ドキュメント ` を参照してくだ さい。 .. _How to do it: 方法 ==== :func:`~django.views.static.serve` ビューの定義を以下に示します。 .. function:: def serve(request, path, document_root, show_indexes=False): このビューを使うには、 :ref:`URLconf ` に以下の設定を入れ ます:: (r'^site_media/(?P.*)$', 'django.views.static.serve', {'document_root': '/path/to/media'}), ``site_media`` はメディアファイル置場のルートの URL にします。 ``/path/to/media`` はメディアファイル置場のルートのファイルシステム上の場所 です。これで、 :func:`~django.views.static.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`` というファイルはドキュメントルート下にないのでアク セスできません。 .. _Directory listings: ディレクトリのリスト表示 ======================== オプションとして、 ``show_indexes`` パラメタを :func:`~django.views.static.serve` ビューに渡せます。デフォルトの値は ``False`` です。 ``True`` にすると、Django はディレクトリに対して内容リスト を表示します。 例:: (r'^site_media/(?P.*)$', 'django.views.static.serve', {'document_root': '/path/to/media', 'show_indexes': True}), ``static/directory_index.html`` テンプレートを変更すれば、 index ビューをカ スタマイズできます。このテンプレートのコンテキストには二つのオブジェクトが 入っています: * ``directory`` -- ディレクトリ名 (文字列) です。 * ``file_list`` -- ディレクトリ中のファイル名 (文字列) です。 デフォルトの ``static/directory_index.html`` テンプレートを示します: .. code-block:: html+django Index of {{ directory }}

Index of {{ directory }}

    {% for f in file_list %}
  • {{ f }}
  • {% endfor %}
.. _Limiting use to DEBUG=True: DEBUG=True の時だけに制限する ============================= URLconf は単なる Python モジュールに過ぎないので、静的メディアビューを開発 モードでしか使えないような Python ロジックを埋め込んでおけます。これは、うっ かり間違えて運用設定に静的ファイル提供ビューが紛れ込まないようにするのに便 利です。 以下のように ``if DEBUG`` 文でラップして :func:`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\d{4})/$', 'news.views.year_archive'), (r'^articles/(?P\d{4})/(?P\d{2})/$', 'news.views.month_archive'), (r'^articles/(?P\d{4})/(?P\d{2})/(?P\d+)/$', 'news.views.article_detail'), ) if settings.DEBUG: urlpatterns += patterns('', (r'^site_media/(?P.*)$', 'django.views.static.serve', {'document_root': '/path/to/media'}), ) コードは一目瞭然で、設定を import して、 :setting:`DEBUG` の値をチェックし ています。値が ``True`` なら、 ``site_media`` は :func:`django.views.static.serve` ビューに関連づけられます。そうでない (``DEBUG == False``) なら、ビューを使えなくなります。 もちろん、運用設定の設定ファイルでは忘れずに ``DEBUG=False`` を設定しておく という前提が必要ですが、何にせよ運用環境では ``DEBUG=False`` を設定すべきで す。