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の静的ファイルとは以下になる.
- Django本体の静的ファイル
- adminのCSS/JS/画像を意味する.django.contrib.adminパッケージの中に同梱されている.
- 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
以上