Django での static files の扱い方まとめ
Django 使って最初にツマヅイタのが、static files (静的ファイル) の扱い方。内蔵Webサーバーを便利に使ってる時と、ApacheなどでWSGIでサービス提供する時では、全然違うので困りました。
違いがあるのは、開発時=速く・簡単に、本番=セキュリティ考慮 という側面を反映したものだと思いますので、最初に勉強しとこうという感じでしょうか。ネットの情報を参照する時に必要な、バージョンによる違いと合わせて、大きく2部構成で、まとめました。
ちなみ、確認環境は Django 1.6.x 系です。
1.覚えておく事:サーバによる違い
- 開発サーバー利用時(開発中)
- 各アプリの static files は、直接アクセス可にしてくれる
- DEBUG="False" か —nostatic の時は、別の動作
- WSGIでハンドル時(本番)
- python manage.py collectstatic で、一カ所に集める
- 集めたところを VirtualDirectory で公開
開発サーバー利用時(開発中)
開発中はプロジェクトディレクトリにて、次のコマンドで開発サーバー利用をします。
$ python manage.py runserver ※settings.py : DEBUG="Ture" のケース
この時、例えば admin が使う /static/admin/ ディレクトリは、公開されておりアクセス可能です。
これは次の組合せで実現されています。
- settings.py の INSTALLED_APPS で django.contrib.staticfiles を有効化
- settings.py の STATIC_URL = '/static/'
- 各種templates の {% static %} テンプレートタグ か {{ STATIC_URL }}
- 各アプリ毎の /static/ ディレクトリを、Django 開発サーバーが公開してくれる
(参考)
しかし、この状態は効率が良くなく、セキュアではない為、本番には向かないとの事(ドキュメントより)。
ちなみに、開発サーバーでも、次の条件が揃うと、 {{ STATIC_URL }} が自動公開されなくなります。
- settings.py : DEBUG="False" & ALLOWED_HOSTS = ['something'] のケース
- settings.py : DEBUG="Ture" & runserver —nostaticオプション付 で起動
- DEBUG="False"の時にも urls.py の設定で、static files を公開する方法もあり(ググってください)
こちらに+α情報を追記しました(2017/2/23)
WSGIでハンドル時(本番)
前述の用に、開発サーバーでは static files の自動公開機能を使えますが、本番のサーバーではそうは行きません。
そこで 各アプリ 中の /static/ を一カ所に集めて、Webサーバーで公開する手順を踏みます。
- settings.py の STATIC_ROOT で static files を集めるディレクトリを指定
- 次のコマンドで、各アプリの /static/ を STATIC_ROOT に集める
- $ python manage.py collectstatic
- STATIC_ROOT/admin/css などのように一カ所に集まる
- STATIC_ROOT を ApacheなどのWebサーバーで STATIC_URL 名で公開
(参考)
- https://docs.djangoproject.com/en/1.6/howto/static-files/#deployment
- https://docs.djangoproject.com/en/1.6/howto/static-files/deployment/
上記のような手順を踏む関係上、各アプリに static files の増減があった場合は、collectstatic を再実行してあげる必要があります。
2.覚えておく事:Djangoバージョンによる違い
Django 1.6までに、一度大きな変更がはいっていおり、以前のバージョンとは互換性がなくなってるようです。
各種エントリーを参考にする場合には、対象としているバージョンを確認するのが良いかと(手抜きしようとして余計な試行錯誤した人 > 自分)
- Django 1.3から
- https://docs.djangoproject.com/en/1.6/releases/1.3/#extended-static-files-handling
- django.contrib.staticfiles 提供開始
- settings.py の STATIC_URL 設定
- templatesでは {{ STATIC_URL}} を利用
- Django 1.4から
- https://docs.djangoproject.com/en/1.6/releases/1.4/
- templatesで {% static %} テンプレートタグ を利用可能になる
- admin の static files も django.contrib.staticfiles で提供
- settings.py の ADMIN_MEDIA_PREFIX 廃止
- 代わりにtemplatesでは {{ STATIC_URL }}admin/ を利用
- Django 1.5から
- https://docs.djangoproject.com/en/1.6/releases/1.5/#miscellaneous
- {% admin_media_prefix %} テンプレートタグ が削除
- {% load adminmedia %} も失敗するようになる (使った事ないので詳細不明)
その他
ドキュメント読んでたら STATICFILES_STORAGE は static files を CDNを使って配信する時に容易に切替えれるとの記述があった。Djangoのカバー領域の広さに、改めて驚きました。