2013-07-05

Djangoで静的ファイルを配信する

settings.pyの設定項目として、MEDIA_URL、MEDIA_ROOT、STATIC_URL、STATIC_ROOT、STATICFILES_DIRSなどがある。昔は、STATICなんちゃらという設定項目は存在しなかったと思う。しかし現在は、MEDIAなんちゃらはユーザがアップロードするファイルの保存と配信についての設定項目で、STATICなんちゃらは開発者があらかじめアップロードしておく静的ファイルの保存と配信のための設定という使い分けがされている。だから、MEDIAなんちゃらとSTATICなんちゃらを同じ値にしてはいけない。

さて、STATIC_URLは、静的ファイルをhttpで配信するときのURLの設定になる。templateのなかでは、{{STATIC_URL}} とやればその値を参照できる。たとえば、STATIC_URL='/static/'; という具合に設定する。

STATIC_URLを指定しても、実は、Djangoは静的ファイルの配信をまったくやってくれない。静的ファイルの配信はWebサーバーの仕事で、Djangoの仕事ではないから、というのがその理由だ。だから、ApacheならApacheを適切に設定してやらないといけない(Djangoの開発用サーバーを使っている場合については後述)。STATIC_URLは、Webサーバーの設定をやり易くしてくれるだけのものだ。

静的ファイル配信のためのWebサーバーの設定を簡単にするために大切なことは2つある。
ひとつは、URLが統一されていること(STATIC_URL)。
もうひとつは、配信する静的ファイルが同じディレクトリにまとめられていることだ。
どこにファイルをまとめることになるのかというと、STATIC_ROOTに設定したディレクトリの下だ。ファイルをまとめるにはツールをつかう。コンソールで「python manage.py collectstatic」を実行すれば、静的ファイルをいろんな場所から、STATIC_ROOTで指定した場所に集めてくれる。
すでに存在するファイルがあるときは、上書きしていいか「yes」か「no」で答えろと迫られる。処理を自動化したい場合は、「python manage.py collectstatic --noinput」としておけば黙って上書きしてくれる。

なんでcollectstaticするのかというと、アプリが複数個あったりプラグインを追加していたりして静的ファイルがいろんなところに散らばっているからだ。
では、collectstaticしたときに、どのディレクトリのファイルを集めてくるか?
ひとつは INSTALLED_APPSで指定したアプリのstaticディレクトリ。
あと、STATICFILES_DIRSに追加指定したディレクトリも対象となる。STATICFILES_DIRSには、タプルで複数の場所を登録できる。

Webサーバーの設定だが、Apacheの場合は、次のような感じだろう(仮に、STATIC_ROOT='/var/www/django/myproject/staticfiles/';とする)。
Alias /static/ /var/www/django/myproject/staticfiles/
<Directory /var/www/django/myproject/staticfiles>
    Order deny,allow
    Allow from all
</Directory>
Djangoの開発サーバーの場合は、urls.pyに、
from django.conf.urls.static import static
urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
とやっておけば大丈夫だと思う。

0 件のコメント: