運用開始時に結構 はまり やすいので、メモをしておきます。
静的ファイル配信の思想
Djangoを 運用する際には、メディアファイルは別の静的ファイル配信サーバからサーブすべし 、というのがDjango開発者達の思想です。
つまり、推奨されるやり方は管理画面メディアファイル配信サーバとして別サーバを指し示し、メディアファイルは配信サーバにコピーしておくことです。
開発時の仕組み
デフォルトのADMIN_MEDIA_PREFIXは /media/ となっています。開発サーバは起動時にメディアファイルを配信するようにハンドラを設定します。
面白いことに、ADMIN_MEDIA_PREFIXの設定を、 /adminmedia/ 等に変更しても、開発サーバ上では正しく動作します。
これは、ADMIN_MEDIA_PREFIXの値が、管理画面のcssを指し示すURLのプリフィックスだからです。もちろん開発サーバのハンドラも同じ値を見ています。
推奨される設定
ベストな方法(別サーバapache)
運用時のADMIN_MEDIA_PREFIXを http://static.example.com/media/
のように設定する。設定したURLで管理画面用のファイルが配信されるように、 django/contrib/admin/media をディレクトリごとコピーしておく。
ベターな方法(同一サーバapache)
運用時のADMIN_MEDIA_PREFIXは /media/
のように同一サーバからの配信となるように設定する。mod_pythonやfastcgiの設定はひとまず忘れて、「ADMIN_MEDIA_PREFIXの設定から呼び出されるURLで管理画面用のファイルが配信されるはずだ」という場所に、 django/contrib/admin/media をディレクトリごとコピーしておく。
mod_pythonで運用する場合には、以下のようにmediaディレクトリのハンドラをオフにする。
<Location "/media/">
SetHandler None
</Location>
fastcgiで運用する場合には、以下のようにmediaディレクトリに対しては rewrite をかけないように設定する(コンディションを!- fにしてもよいはず)。
RewriteRule ^(media/.*)$ - [L]
推奨されない設定
しかし、管理インターフェースのメディアファイルについては量も頻度もたいしたことないので、以下のようにしても良いのではないかとも思う(イマイチな方法)。
ADMIN_MEDIA_DIR という定数を settings.py に定義する。指し示し先は管理画面用のメディアファイルディレクトリ (django/contrib/admin/media) のフルパス。
次に urls.py で Django が静的ファイルを返すように設定する。
(r'^media/(?P.*)','django.views.static.serve',
{'document_root' : settings.ADMIN_MEDIA_DIR, 'show_indexes':False})