はじめに
この記事 で環境構築をしたときに静的ファイルの管理フォルダとしてstatic
をルート直下に作成しました。
そして、settings.py
において
STATIC_URL = '/static/'
STATIC_ROOT = '/static'
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR,'media')
こういう設定をしたのも覚えているでしょうか?
そして、最終的にpython manage.py collectstatic
こういう呪文を唱えたのも覚えているでしょうか。
今回はこのあたりがどういう流れになっているのかを少し掘り下げるとともに改めて整理したいと思います。
Djangoでの静的ファイルの管理
そもそも静的ファイルと動的ファイルってなに?
改めて整理をしておきます。
-
静的ファイルはやり取りの間で変更や更新されないでやり取りされるファイルである……といったような理解を以前したと思いますがもっと厳密に言うと、静的Webサーバー内においてサーバーからブラウザへ「そのまま」送られるような処理をされるファイルのことを指します。
リクエストされたサーバー内のファイルをそのままHTTPレスポンスとしてブラウザへ返すというような処理が行われているわけです。 -
対して動的ファイルは静的Webサーバー・アプリケーションサーバー・データベースなどで構成されるサーバーで、アプリケーションサーバーがHTTPサーバーを通してブラウザに送信する前に、更新するような処理が行われるファイルのことを指します。
冒頭の記事ではログイン処理を例にしてまとめてありますが、ブラウザからリクエストが来るとWebサーバー内でHTTPサーバーなどを通して、アプリケーションサーバーにリクエストがパスされ、それをもとにDBからデータを取得して、さらにそこからリクエストに応じたレスポンスを生成する……といった処理が行われています。
このような処理のことを指して「動的」というみたいですね。
参考:Web サーバとは
参考:Djangoで静的ファイルとうまくやる
本題
では、冒頭の話に戻ります。
Djangoでの静的ファイルの扱いはsettings.DEBUG
がTrue
かFalse
かで変わってきます。そして、それがややこしいところみたいです。
まずはTrue
だった場合、つまり開発モード状態の時はdjango.contrib.staticfiles
のおかげで指定を行い、runserver
コマンドを行えばデフォルトで静的ファイルが適用されている状態となります。
じゃあFalse
、つまり本番環境だった場合はどうなるかというと何も設定を行わなければ静的ファイルは無視されてしまいます。
何故かというと、本番環境ではローカル環境とは違い、NginxなどのWebサーバーにおいて静的ファイルのやり取りを管理するからです。
ここまで理解できたら改めて冒頭の記事で以下のような設定をしたのを振り返りましょう。
upstream django {
ip_hash;
server python:8888;
}
# configuration of the server(サーバーの構成)
server {
# the port your site will be served on
listen 8000;
# the domain name it will serve for
server_name 127.0.0.1; # substitute your machine`s IP address or FQDN
charset utf-8;
# max upload size(メディアファイルのアップロード上限)
client_max_body_size 75M;
location /static {
alias /static;
}
# Finally, send all non-media requests to the Django server.
location / {
uwsgi_pass django;
include /etc/nginx/uwsgi_params; # the uwsgi_params file you installed
}
}
これはNginxにおいてリクエストがどのようにパスされるべきかということを設定したファイルでした。
おさらいすると
- リクエストは8000ポートでまずキャッチする。
- キャッチしたものが静的ファイルへのリクエストだった場合はNginxのstaticへパスをする。
- それ以外でアプリケーションサーバー(uWSGI)へリクエストをパスする必要がある場合は8888ポートにリクエストを飛ばす。
ということが書いてあります。
合わせてこちらも見てみましょう。
STATIC_URL = '/static/'
STATIC_ROOT = '/static'
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR,'media')
STATIC_URL
はDjangoアプリケーションにおいて静的ファイルを参照したいときに叩かれるURLを設定しているものです。
こことNginx側のlocation /static { alias /static; }
の部分でWebサーバー側とDjango側で静的ファイルのやり取りをするルートを設定していることになります。
STATIC_ROOT = '/static'
は静的ファイルが集まっているフォルダへのディレクトリを設定します。
冒頭の記事や今回のチュートリアルではルート直下にそのためのフォルダとしてstatic
を作っていますが、実は各アプリケーションフォルダの直下にそれぞれstaticを置くこともできます。
ただし、それだと管理が煩雑になってしまうため静的フォルダをまとめるフォルダを作り、その中に各アプリケーションごとの静的ファイルのフォルダを収めるようにしようということです。
最後にadmin、つまり管理用ページに静的ファイルを適用させるために、STATIC_ROOT
に静的ファイルを集約するcollectstatic
コマンドを実行すれば無事静的ファイルを本番環境で扱う準備が整いました。
MEDIA_URL
やMEDIA_BOOT
などで設定するメディアファイルの設定に関しては静的ファイルと仕組みは同じなので割愛します。