明るく

暗く

Django

Djangoのstaticフォルダの読み込み順序|共通ファイルの場所はどこが適切か

2024.5.6

2024.5.10

Djangoのstaticフォルダの読み込み順序|共通ファイルの場所はどこが適切か

Djangoにおいて、CSSやJavaScript、画像データなどの静的ファイルを配置する場所はstaticフォルダと呼ばれます。

 

デフォルトの設定では各アプリケーションのディレクトリ直下にあるstaticフォルダを参照するようになっていますが、すべてのページに共通する、もしくはアプリ間を横断して適用される静的ファイルはどこに置けば良いのか迷ったことはありませんか?

 

ここでは共通staticフォルダの配置場所から、Djangoのstaticフォルダの読み込み順序(検索順序)について解説します。

Djangoのstaticフォルダの読み込み順序

まず、Djangoのデフォルトの設定をおさらいしておきましょう。

Djangoの設計と読み込み順序

Djangoではプロジェクト(project)という最上位の概念の中に、各機能を表すアプリ(app)を作成し、アプリを組み合わせることで様々な機能を持った1つのプロジェクトを作成するという設計になっています。

 

静的ファイルを配置するstaticフォルダは、この各アプリごとに作成し、「static/app_name/css」といったディレクトリ構成を行うことが推奨されています。(Djangoの公式チュートリアルでもこのように解説されています)

myapp1/
├── static/
│   └── myapp/
│       └── css/
│           └── style.css
└── ...
│
myapp2/
├── static/
│   └── myapp/
│       └── css/
│           └── style.css
└── ...

staticフォルダが存在する各アプリ配下のhtmlファイルなどから同じファイル名の静的ファイルが呼び出された場合、その呼び出したhtmlファイルが存在するアプリの中にある、staticフォルダ内のファイルが参照されます。(つまり上記の場合、myapp1内のhtmlファイルからstyle.cssが呼び出されたときには、myapp1のstaticフォルダが参照され、そのなかにあるstyle.cssが適用されます)

 

もし、同じアプリ内に同名の静的ファイルが無い場合は、プロジェクト全体に適用されるstaticフォルダを検索し、その後にDjango標準のdjango.contrib.staticfilesから提供される静的ファイルという流れになるのです。

読み込み順序(検索順序)のまとめ

デフォルトの読み込み順序をまとめると、以下のようになります。

 

  1. アプリケーション固有のstaticフォルダ
  2. プロジェクト全体のstaticフォルダ
  3. Djangoが標準で用意しているdjango.contrib.staticfilesから提供される静的ファイル

共通の静的ファイルはどの場所に配置する?

上記で解説した読み込み順序②に当たるプロジェクト全体に適用するような共通ファイルは、プロジェクト直下に置くのが一般的です。

myproject/
├── static/
│   ├── css/
│   │   └── base.css
│   └── js/
│       └── script.js
└── ...

上記の例では、いくつかのアプリを包含するmyprojectというプロジェクトの直下にstaticファイルが配置されています。この中には、すべてのアプリで共通して使用するような汎用的な静的ファイルを置きましょう。

共通staticフォルダを作成する際の注意点

デフォルトの設定では、各アプリの直下にあるstaticフォルダしか参照してくれないため、プロジェクト直下に共通のstaticフォルダを作成する場合にはsetting.pyの内容を編集する必要があります。

 

setting.pyを開いて、静的ファイルを探すディレクトリのリストを指定するSTATICFILES_DIRSの設定を追記しましょう。(ディレクトリの指定には標準で用意されているosモジュールを利用する必要があるため、上部でimportします)

import os
・
・
・
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static'),
]

この設定を追記することで、プロジェクト直下にあるstaticフォルダも検索対象になります。

コラム:os.path.join(BASE_DIR, ‘static’)について

STATICFILES_DIRSの内容として記述されているos.path.join(BASE_DIR, ‘static’)では、BASE_DIRと’static’をjoinで結合し、プロジェクト直下のルートディレクトリにあるstaticフォルダを指定しています。BASE_DIRの内容は、デフォルトでプロジェクト直下がすでに指定されています。(setting.pyの中で記述を検索してみてください)