Djangoにおける静的ファイル(static file)の取り扱い

DjangoのチュートリアルやUdemyの授業を進める中で、理解できなかったsettings.pyの下の方に追記する、STATICFILES_DIRSSTATIC_ROOTSTATIC_URLについてわかりやすい記事があったので、備忘のために。(翻訳許可済み)

Django Static Files

同じことに悩まれている方の参考になれば嬉しいです。


STATICFILES_DIRS

個別のアプリケーションではなく、トップページに表示する画像などを保管する任意の場所を、Djangoに探すように指定するのがSTATICFILES_DIRS。(ここでは仮にプロジェクト直下に"assets"というフォルダを作成。)


settings.py

STATICFILES_DIRS = [

os.path.join(BASE_DIR, "assets")
]


Application/static/

"Application/"という名前のアプリケーションを作成したとする。このアプリケーションに関するstatic_file(cssやjs, 画像など)は、"Application/static/"に保管する。これはアプリケーションごとに作成するので、アプリケーションの数だけ増える。

これで、下のように静的ファイルの置き場所ができた。(Application1,2,3を作成したとする。)

ローカルでの開発環境では、このように静的ファイルが別々のフォルダに格納されていても問題はない。

Screen Shot 2019-02-05 at 0.03.27.png


collectstatic コマンド

web server(NGINX等)やHerokuにデプロイする際には、静的ファイルの置き場所を複数ではなく、一つの場所に集めてあげる必要がある。それがcollectstaticコマンド。しかし、collectstaticする前に、集める場所をsettings.pyに設定する必要がある。(プロジェクト直下、"static"というフォルダを指定。)


settings.py

STATIC_ROOT = os.path.join(BASE_DIR, 'static')


この後、

$ python manage.py collectstatic

これで下のように静的ファイルが、プロジェクト直下の"static"に集約される。

Screen Shot 2019-02-05 at 0.30.59.png


STATIC_URL

web serverに静的ファイルを見に行く場所を指定する。

・NGNIXの例

location /static/ {

root /my/project/static/;
}

そして最後に、デプロイ環境で、{% static 'main.css' %}などのDjangoテンプレートが読みに行く場所をsettings.pyにSTATIC_URLで指定してあげる。


settings.py

STATIC_URL = '/static/'



まとめ

最終的には下のイメージになる。

開発環境では、プロジェクト直下や各アプリケーションごとに静的ファイルの置き場を作成してそれぞれを呼び出す。

デプロイする際は、個別の静的ファイルをSTATIC_ROOTで指定した場所にcollectstaticで全て集める。

その後、web serverにSTATIC_ROOT(static/)を見に行くようにSTATIC_URLで指定する。

Screen Shot 2019-02-05 at 0.54.47.png

間違っている箇所等あれば、コメントいただけると助かります。

以上です。