AWS / PHP / Python ちょいメモ

amazon web service , PHP, Python を使ったときのメモ。日本語でググってもわからなかった事を中心に。

Django での static files の扱い方まとめ

Django 使って最初にツマヅイタのが、static files (静的ファイル) の扱い方。内蔵Webサーバーを便利に使ってる時と、ApacheなどでWSGIでサービス提供する時では、全然違うので困りました。

違いがあるのは、開発時=速く・簡単に、本番=セキュリティ考慮 という側面を反映したものだと思いますので、最初に勉強しとこうという感じでしょうか。ネットの情報を参照する時に必要な、バージョンによる違いと合わせて、大きく2部構成で、まとめました。

ちなみ、確認環境は Django 1.6.x 系です。

1.覚えておく事:サーバによる違い

  • 開発サーバー利用時(開発中)
    1. 各アプリの static files は、直接アクセス可にしてくれる
    2. DEBUG="False" か —nostatic の時は、別の動作
  • WSGIでハンドル時(本番)
    1. python manage.py collectstatic で、一カ所に集める
    2. 集めたところを VirtualDirectory で公開

開発サーバー利用時(開発中)

開発中はプロジェクトディレクトリにて、次のコマンドで開発サーバー利用をします。

$ python manage.py runserver

※settings.py : DEBUG="Ture" のケース

この時、例えば admin が使う /static/admin/ ディレクトリは、公開されておりアクセス可能です。

これは次の組合せで実現されています。

  1. settings.py の INSTALLED_APPS で django.contrib.staticfiles を有効化
  2. settings.py の STATIC_URL = '/static/'
  3. 各種templates の {% static %} テンプレートタグ か {{ STATIC_URL }}
  4. 各アプリ毎の /static/ ディレクトリを、Django 開発サーバーが公開してくれる


(参考)


しかし、この状態は効率が良くなく、セキュアではない為、本番には向かないとの事(ドキュメントより)。


ちなみに、開発サーバーでも、次の条件が揃うと、 {{ STATIC_URL }} が自動公開されなくなります。

  1. settings.py : DEBUG="False" & ALLOWED_HOSTS = ['something'] のケース
  2. settings.py : DEBUG="Ture" & runserver —nostaticオプション付 で起動
  3. DEBUG="False"の時にも urls.py の設定で、static files を公開する方法もあり(ググってください)


こちらに+α情報を追記しました(2017/2/23)

WSGIでハンドル時(本番)

前述の用に、開発サーバーでは static files の自動公開機能を使えますが、本番のサーバーではそうは行きません。
そこで 各アプリ 中の /static/ を一カ所に集めて、Webサーバーで公開する手順を踏みます。

  1. settings.py の STATIC_ROOT で static files を集めるディレクトリを指定
  2. 次のコマンドで、各アプリの /static/ を STATIC_ROOT に集める
    • $ python manage.py collectstatic
  3. STATIC_ROOT/admin/css などのように一カ所に集まる
  4. STATIC_ROOT を ApacheなどのWebサーバーで STATIC_URL 名で公開

(参考)


上記のような手順を踏む関係上、各アプリに static files の増減があった場合は、collectstatic を再実行してあげる必要があります。


2.覚えておく事:Djangoバージョンによる違い

Django 1.6までに、一度大きな変更がはいっていおり、以前のバージョンとは互換性がなくなってるようです。

各種エントリーを参考にする場合には、対象としているバージョンを確認するのが良いかと(手抜きしようとして余計な試行錯誤した人 > 自分)

その他

ドキュメント読んでたら STATICFILES_STORAGE は static files を CDNを使って配信する時に容易に切替えれるとの記述があった。Djangoのカバー領域の広さに、改めて驚きました。

参考

このエントリーに、一番最初に助けられました。感謝です。

http://hyokonia.tumblr.com/post/7036722697/djangostaticfilesの使い方

undefined!! - [Django]staticfilesの使い方