Django 静的ファイル

ここまででプロジェクトを作り、アプリを作ってurls.py、views.py、models.py、そしてテンプレート(index.html)を編集することで、Webアプリとしての一連の動作をするところまできました。まだまだ知っておくべきことはありますが、それらの各要素を深掘りし始めると静的ファイルの話をする機会を逸してしまうと思いますので、このタイミングで強引ですがここでやってしまいたいと思います。

静的ファイル

ここで扱う静的ファイルとは、HTML, CSS, JavaScriptの類いを指しています。もちろん画像やアイコンも含まれていますが、例えばユーザーが写真をアップロードしてそれがページに掲載されるという場合の画像ファイルはこれには含まれていません。

DjangoではそういったファイルはMEDIAファイルと呼ばれています。そもそもですが、Webアプリケーションにとってはアップロードされた画像はデータです。例えば複数ノードで運用する場合にはテーブルの1カラムにデータとして保管するという設計すら選択肢となり得るので、静的ファイルとは分けて考えるというのもおかしな話ではありません。

静的ファイルを雑に言い換えてみると、Gitで管理されてそうなファイルたちといったところでしょうか。

静的ファイルに関する設定

houjin/settings.pyにSTATIC_URLとSTATIC_ROOTの設定をします。STATIC_URLは外部からアクセスされるときにパスとして使い、STATIC_ROOTはファイルを実際に配置するディレクトリになります。

これらが実際に効力を発揮するのは、houjin/urls.pyに以下のコードを追加する必要があります。

最後の行によってSTATIC_URLへのアクセスをSTATIC_ROOTへという構成になります。

すこし脱線ですが、settings.pyに設定した値は、settings.STATC_URLなどのように取得することが出来ますので、プロジェクト全体に共通する設定値などは独自の物でもどんどんsettings.pyに記載していって良いと思います。

from django.conf import settings

print(settings.STATIC_URL)
print(settings.STATIC_ROOT)

本線に戻ります。

ここで設定したSTATIC_ROOTですが、BASE_DIR配下のstaticディレクトリになりますので、logやtmpと同じ並びになりますが、開発中(DEBUG=True)にいくらここにファイルを配置しても読んでくれません。

知らないと、ドハマリポイントになります。

はい、私嵌まりました。

ではどこに配置するべきかというと、app/staticです。もちろん最初は存在しないのでディレクトリを作成してそこに配置することになります。

そうすると、BASE_DIR直下のstaticディレクトリはいつ使われるのかという話ですが、それが本番環境(DEBUG=False)になるですが、実は自動的にそこに配置される訳ではなく以下のコマンドを実行する必要があります。

python manage.py collectstatic

このコマンドを実行することでapp/static配下にあるファイルをごっそり集めてBASE_DIR直下のstaticディレクトリに配置してくれます。ですので、本番環境では上記コマンドの実行は必須です。

もう一つ重要なことは、app/static配下のファイルをstaticディレクトリに集めてくれるということは、もう一つ別のアプリ(分かりやすくapp2とします)があるとapp2/staticのファイルもBASE_DIR配下のstaticディレクトリに集めてくれますので、両方でindex.cssなんて同名のファイルを作ってしまうと・・・です。

なので、app/static/appなどとstatic配下に集められたときのためにアプリ名を最後にもう一回使ってその中で自由にファイルを作成するか、接頭辞(例:app_)を各ファイルに付けるなどの一工夫が必要かと思います。

Webサーバーの設定

本番環境では最後にもう一仕事あります。BASE_DIR直下のstaticディレクトリにリクエストが正しく到達するように設定が必要です。

nginxであれば以下のような設定です。

    location /static/ {
        rewrite ^/static/(.*)$ /$1 break;
        root /file_to_path/houjin/houjin/static;
    }

/static/で始まるリクエストのドキュメントルートをBASE_DIR直下のstaticディレクトリに指定しておき、/static/の続きのファイルを要求するように書き換えしています。

書き換えせずにアクセスさせると、staticが2枚重ねになり、root側で調整することも出来ると思いますがBASE_DIR自体をrootに指定するのには抵抗感があると思いますのでこのようにしています。

シリーズの案内

 親記事 Hello Django
 前の記事 Djangoでアプリの作成と構成
 次の記事 Django モデル入門(models.py)