ModuleNotFoundError: No module named ‘xxx.wsgi’の原因について

ModuleNotFoundError: No module named ‘xxx.wsgi’の原因について

当記事では、エラー「ModuleNotFoundError: No module named ‘xxx.wsgi’」が発生したときの原因及び解消方法について、私が調べた結果を備忘録として載せます。

エラーが発生した状況

【環境】
言語:python
フレームワーク:Django
サーバー:heroku

①ローカル環境では、実行できることを確認済

②herokuサーバにデプロイするとデプロイ成功後、「at=error code=H10 desc=”App crashed”」とログに表示される

③詳細を確認したところ、「ModuleNotFoundError: No module named ‘アプリ名.wsgi’」が発生

※詳細の確認については、下記の補足を参照

Procfile

web: gunicorn アプリ名.wsgi --log-file -

エラーログ

2020-10-11T03:26:41.025220+00:00 app[web.1]:   File "<frozen importlib._bootstrap>", line 994, in _gcd_import
2020-10-11T03:26:41.025220+00:00 app[web.1]:   File "<frozen importlib._bootstrap>", line 971, in _find_and_load
2020-10-11T03:26:41.025220+00:00 app[web.1]:   File "<frozen importlib._bootstrap>", line 953, in _find_and_load_unlocked
2020-10-11T03:26:41.025226+00:00 app[web.1]: ModuleNotFoundError: No module named 'アプリ名.wsgi'
2020-10-11T03:26:41.025389+00:00 app[web.1]: [2020-10-11 03:26:41 +0000] [10] [INFO] Worker exiting (pid: 10)
2020-10-11T03:26:41.029372+00:00 app[web.1]: [2020-10-11 03:26:41 +0000] [11] [ERROR] Exception in worker process

原因および解消方法

【原因】
Procfileの記載内容が間違えている

【対処方法】
Procfileの記載内容を修正

誤り
※アプリ名で固定ではない。

web: gunicorn 【アプリ名】.wsgi --log-file -

正しい
※setting.py – WSGI_APPLICATIONの変数に記載されている「config.wsgi」

web: gunicorn config.wsgi --log-file -


【エラー解説】
Procfileのgunicornコマンドは、runserverコマンドの強化版のようなものです。

runserverコマンドでは、setting.pyに記載されている下記の変数を使用しています。

WSGI_APPLICATION = 'config.wsgi.application'

既にローカル環境で実行できることを確認しており、今回のようなエラー「ModuleNotFoundError: No module named ‘アプリ名.wsgi’」が発生する場合は、Procfileに記載されている内容がsetting.pyとずれていないか確認してください。

ネット上では、Procfileには、アプリ名を記載するように書かれていますが、正確には、setting.pyファイルを参照し、記載すべきです。

まとめ

Procfileに記載する内容は、「web: gunicorn 【アプリ名】.wsgi –log-file -」固定ではない。

正しくは、「web: gunicorn 【setting.py – WSGI_APPLICATIONを参照】.wsgi –log-file -」である。

補足

herokuサーバにデプロイ後、アプリがcrashした場合、herokuのログにはcrashしか表示されない。

2020-10-11T03:04:38.796013+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/" host=instafavobot.herokuapp.com request_id=bdd7e9cb-c48b-41d1-b6fb-05b2a009c15c fwd="110.1.100.137" dyno= connect= service= status=503 bytes= protocol=https
2020-10-11T03:04:40.000712+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/favicon.ico" host=instafavobot.herokuapp.com request_id=20a1a4a3-3a8a-4a6f-ae3d-fae01dcc7e6f fwd="110.1.100.137" dyno= connect= service= status=503 bytes= protocol=https

詳細を確認するには、herokuでログを表示しながらデプロイを行うと、詳細なエラーが表示される。

2020-10-11T03:26:03.000000+00:00 app[api]: Build started by user 
2020-10-11T03:26:33.050976+00:00 app[api]: Deploy e010284c by user
2020-10-11T03:26:33.050976+00:00 app[api]: Release v8 created by user 
2020-10-11T03:26:33.504864+00:00 heroku[web.1]: State changed from crashed to starting
2020-10-11T03:26:38.637873+00:00 heroku[web.1]: Starting process with command `gunicorn insta_auto_iine_app.wsgi --log-file -`
2020-10-11T03:26:41.256697+00:00 heroku[web.1]: Process exited with status 3
2020-10-11T03:26:41.301623+00:00 heroku[web.1]: State changed from starting to crashed
...
2020-10-11T03:26:41.029555+00:00 app[web.1]: ModuleNotFoundError: No module named 'insta_auto_iine_app.wsgi'