Pythonでのチームアプリ開発に参画するための学習履歴~Djangoチュートリアル6~

# はじめに


[この記事](https://qiita.com/shitikakei/items/5ba2f3e028f84371af9c) で環境構築をしたときに静的ファイルの管理フォルダとして`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 サーバとは](https://developer.mozilla.org/ja/docs/Learn/Common_questions/What_is_a_web_server)
[参考:Djangoで静的ファイルとうまくやる](https://tell-k.github.io/djangocongressjp2019)


#### 本題

では、冒頭の話に戻ります。
Djangoでの静的ファイルの扱いは`settings.DEBUG`が`True`か`False`かで変わってきます。そして、それがややこしいところみたいです。
まずは`True`だった場合、つまり開発モード状態の時は`django.contrib.staticfiles`のおかげで指定を行い、`runserver`コマンドを行えばデフォルトで静的ファイルが適用されている状態となります。

じゃあ`False`、つまり本番環境だった場合はどうなるかというと何も設定を行わなければ静的ファイルは無視されてしまいます。
何故かというと、本番環境ではローカル環境とは違い、NginxなどのWebサーバーにおいて静的ファイルのやり取りを管理するからです。
ここまで理解できたら改めて冒頭の記事で以下のような設定をしたのを振り返りましょう。


```nginx.conf
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ポートにリクエストを飛ばす。

ということが書いてあります。
合わせてこちらも見てみましょう。


```settings.py

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`などで設定するメディアファイルの設定に関しては静的ファイルと仕組みは同じなので割愛します。


# 参考

[参考:Web サーバとは](https://developer.mozilla.org/ja/docs/Learn/Common_questions/What_is_a_web_server)
[参考:Djangoで静的ファイルとうまくやる](https://tell-k.github.io/djangocongressjp2019)
[Djangoドキュメント](https://docs.djangoproject.com/ja/3.0/ref/settings/#std:setting-STATIC_URL)