Python | Django | “collectstatic”についての説明

Pythonとは,高レベルの汎用プログラミング言語であり,読みやすさとシンプルさで知られている.Web開発やデータサイエンス,人口知能,機械学習など幅広く利用されている.なお,レベルの高低はハードウェアに近いかどうかを意味しており,レベルが低いとハードウェアに近いことを意味している.

Pythonには,DjangoというWebアプリケーションフレームワークがある.フレームワークのため,Djangoを利用するとWebアプリを通常よりも短時間で開発することが可能になる.

Djangoにて以下コマンドを実行すると,"STATIC_ROOT"(通常は"/staticfiles/")にコピーされる.開発時には利用されず,本番運用のために重要になるコマンドとなる.

$ python manage.py collectstatic

本記事では,"python manage.py collectstatic"(以下"collectstatic")についての説明を記す.

実施環境

Windows 11
Python 3.12.0
Django 5.2.3
Visual Studio Code (VS Code) 1.102.2

shelokuma tech blog | バージョン確認方法

“collectstatic"についての説明

現在の私のディレクトリ構成は以下になる."backend"ディレクトリではDjangoでの開発,"frontend"ディレクトリではReactでの開発としている.

SDS_dev
 ├─ backend
 └─ frontend

Djangoには開発時に静的ファイル置き場(static/)と本番用にまとめられた静的ファイル置き場(staticfiles/)がある."static/"ディレクトリにアプリごとのCSS, JS, 画像などが格納されている.

“backend"ディレクトリにて,以下コマンドを実行すると,アプリや各ディレクトリの"static/"内にあるファイルが"STATIC_ROOT"(通常"staticfiles/")にコピーされる.

$ python manage.py collectstatic

なお,通常 Djangoの"python manage.py collectstatic"は主に以下タイミングに実行する.

  • 本番環境にデプロイするとき
  • 静的ファイルを更新するとき
  • CI/CDパイプラインでの自動実行時

実行タイミング

本番環境にデプロイするとき

Djangoの"static/"ディレクトリにはアプリごとCSS, JS, 画像などが格納されている."collectstatic"を実行すると,それらがまとめて"STATIC_ROOT"(通常"/staticfiles/")にコピーされる.

その後,Webサーバー(nginxやApache)などがまとめて配信できるようになる.

静的ファイルを更新するとき

新しいCSSを書いたり,JavaSctiptを修正したり,画像を差し替えたりする場合,もう一度"collectstatic"を実行する.実行しないと,古いバージョンのファイルが配信され続けてしまう.

CI/CDパイプラインでの自動実行時

本番用にデプロイするたびに,GitHub ActionsやJenkinsなどのCI/CDで自動的に"collectstatic"を実行させ,最新の静的ファイルをサーバーにアップロードする.

実行場所

以下コマンドは,Djangoのプロジェクトルートで実行する.私の場合"backend/"下に”manage.py"が格納されているので,"backend"ディレクトリで実行する.

$ python manage.py collectstatic

Djangoが"collectstatic"によって,コピーされる対象となるディレクトリは以下となる.

  • 各アプリケーションの"static/"ディレクトリ
  • プロジェクト全体で指定した追加ディレクトリ
  • Djangoやthird party packageのstatic

コピーされる対象のディレクトリ

各アプリケーションの"static/"ディレクトリ

“backend"ディレクトリ下に2つのアプリケーションディレクトリがある.

SDS_dev
 ├─ backend
 |     ├─ sdsapp
 |     └─ anotherapp
 └─ frontend

上記の場合,以下ディレクトリがコピーされる対象となる.

  • backend/sdsapp/static/
  • backend/anotherapp/static/

プロジェクト全体で指定した追加ディレクトリ

“settings.py"の"STATICFILES_DIRS"に指定パスを入力する.

STATICFILES_DIRS = [
    BASE_DIR / "static",
]

上記の場合,以下ディレクトリがコピーされる対象となる.

  • backend/static/

Djangoやthird party(Djangoアプリ)の静的ファイル

Djangoやthird party packageの静的ファイルとは以下になる.

  1. Django本体の静的ファイル
    • adminのCSS/JS/画像を意味する.django.contrib.adminパッケージの中に同梱されている.
  2. third party(Djangoアプリ)の静的ファイル
    • django-rest-frameworkのブラウザ閲覧API用のCSS/JS
    • django-debug-toolbarのパネル用アセット
    • django-allauthの画像

コピーの出力先

すべてのファイルは"STATIC_ROOT"にまとめられる."STATIC_ROOT"は通常"settings.py"に以下のように設定する.

STATIC_ROOT = BASE_DIR / "staticfiles"

“collectstatic"実行後は,以下のようにまとまる.

backend/staticfiles/
  admin/...
  sdsapp/...
  anotherapp/...

注意点

“frontend"ディレクトリの静的ファイルはDjangoの"collectstatic"とは無関係になる.Reactの場合,"frontend"ディレクトリにて以下コマンドを実行することによって,"frondtend/.next/"や"frontend/out/"などに出力される.

npm run build

React側の静的ファイルをDjangoで配信する場合,"STATICFILES_DIR"にReactの"build/static"を追加する必要がある.

参照

django | 5.2 Documentation | The staticfiles app

以上