0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-04-23

はじめに

この記事 で環境構築をしたときに静的ファイルの管理フォルダとして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.DEBUGTrueFalseかで変わってきます。そして、それがややこしいところみたいです。
まずは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_URLMEDIA_BOOTなどで設定するメディアファイルの設定に関しては静的ファイルと仕組みは同じなので割愛します。

参考

参考:Web サーバとは
参考:Djangoで静的ファイルとうまくやる
Djangoドキュメント

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?