Zenn
🕌

Djangoアプリをデプロイしたけど、静的ファイルが反映されなかった。

2025/03/26に公開

はじめに

使用技術

  • Python3.12
  • Django
  • Azure(App Service)
  • PostgreSQL(Azure Database for PostgreSQL Flexible Server)
  • Github Actions(開発しているアプリをGithub Actionsで自動デプロイを行っています。)

前提

なぜ静的ファイルが反映されないのか?

  • 開発環境では、Djangoがdjango.contrib.staticfilesというアプリケーションを使って、静的ファイルを自動的に提供しています。
  • 本番環境では、静的ファイルは通常、Webサーバー(例: NginxやApache)によって提供されるように設定されます。しかし、Djangoのサーバーでは静的ファイルは自動的には提供されないため適切に出力がされません。

解決するには?

  • collectstaticコマンドを使って静的ファイルをSTATIC_ROOTにまとめる必要があります。
  • これにより、Webサーバーが効率よく静的ファイルを配信できるようになります。

概要

  1. 静的ファイルの設定。
  2. whitenoiseの追加。
  3. collectstaticコマンドを実行。
  4. requirements.txtの修正。

手順

1. 静的ファイルの設定。

  • settings.pyを書き換えていきます。
  1. デプロイする時はDEBUG = Falseにしてください。
  2. STATIC_ROOTを作成。
  • 開発環境では、静的ファイルは各アプリケーションのstaticフォルダに格納されますが、本番環境にデプロイする際は、これらの静的ファイルを一箇所に集める必要があります。
  • Djangoのcollectstaticコマンドを使って、これらのファイルをSTATIC_ROOTディレクトリにまとめます。
  • 以下のコードと同じように記載することで、staticと同じ階層にstaticfilesが自動で作成されるようになります。
  • (collectstaticコマンドは後ほど行います。)
BASE_DIR = Path(__file__).resolve().parent.parent
TEMPLATE_DIR = os.path.join(BASE_DIR, "templates")
STATIC_DIR = os.path.join(BASE_DIR, 'static')

DEBUG = False

ALLOWED_HOSTS = ['*']
~~~
STATIC_URL = '/static/'
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')

2. whitenoiseの追加。

  • 私は今回、PaaSでアプリを動かしています。
  • WhiteNoiseがなくてもデプロイは可能です。
  • しかし、外部Webサーバー(NginxやApacheなど)を使って静的ファイルを提供する必要があります。
  • IaaS(AWS EC2やGoogle Cloud VMなど)を使用する場合、サーバーから直接静的ファイルにアクセスできるので、Whitenoiseがなくても良いということです。
  • 今回はWhiteNoiseを使って実装します。
  1. whitenoiseのインストール。(デプロイ環境でもインストールをしてください。)
pip install whitenoise
  1. MIDDLEWAREに記載。(下記のコード参照)
  2. STATICFILES_STORAGEの記載。
~~~
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'whitenoise.middleware.WhiteNoiseMiddleware',
    ~~~
]
~~~
STATICFILES_STORAGE = "whitenoise.storage.CompressedManifestStaticFilesStorage"

3. collectstaticコマンドを実行。

  • 静的ファイルをcollectstaticコマンドで1箇所に集めます。
  • ローカル環境で行っておけば、サーバー上で行う必要はありません。
python manage.py collectstatic

4. requirements.txtの書き換え。

pip freeze > requirements.txt

さいごに

  • 最後まで読んでくださりありがとうございます。
  • 私はrequirements.txt`の書き換えるのを忘れており、実装に時間がかかってしまいました。
  • いつかの自分のためにと思い、記事を書きました。
  • 誰かの参考になればと思います。
  • 誤り等あれば教えてください。

参考文献

https://docs.djangoproject.com/ja/4.2/howto/static-files/#how-to-manage-static-files-e-g-images-javascript-css
https://docs.djangoproject.com/ja/4.2/howto/static-files/deployment/
https://note.com/t_ak66/n/n8db4a92e59ff

Discussion

ログインするとコメントできます