Gunicorn実行時にFailed to find attribute ‘app’ in ‘app’.というエラーが出た時の対処方法
2024年10月7日
こんにちは!
今回の記事では、Gunicorn実行時にFailed to find attribute ‘app’ in ‘app’.というエラーが出た時の対処方法について解説したいと思います。
上記のエラーが出た方はぜひ参考にしてください。
エラーがでた状況
まずは、エラーが出た状況について解説します。
Flaskのアプリケーションで、Blueprintを使って機能を分割していました。
アプリケーションを本番環境へリリースするために、以下のコマンドを実行しました。
gunicorn app:app
コマンドを実行すると、以下のエラーが出ました。
[2024-10-07 08:51:22 +0900] [2457] [INFO] Starting gunicorn 22.0.0
[2024-10-07 08:51:22 +0900] [2457] [INFO] Listening at: http://127.0.0.1:8000 (2457)
[2024-10-07 08:51:22 +0900] [2457] [INFO] Using worker: sync
[2024-10-07 08:51:22 +0900] [2458] [INFO] Booting worker with pid: 2458
Failed to find attribute 'app' in 'app'.
[2024-10-07 08:51:22 +0900] [2458] [INFO] Worker exiting (pid: 2458)
[2024-10-07 08:51:23 +0900] [2457] [ERROR] Worker (pid:2458) exited with code 4
[2024-10-07 08:51:23 +0900] [2457] [ERROR] Shutting down: Master
[2024-10-07 08:51:23 +0900] [2457] [ERROR] Reason: App failed to load.
Failed to find attribute ‘app’ in ‘app’.とは?
Failed to find attribute ‘app’ in ‘app’.を日本語に訳すと、「’app’で属性’app’が見つかりませんでした。」となります。
これは、gunicornがappという名前の属性をappモジュール内で見つけられなかったことを示しています。
今回、app.pyを以下のように定義していました。
from app import create_app
app = create_app()
if __name__ == '__main__':
app.run(debug=True)
このコードは、create_app()関数を呼び出してappというFlaskアプリケーションインスタンスを作成しています。
gunicornが最初に読み込むのはappというモジュールです。
モジュール内にappという名前の属性(Flaskインスタンス)が直接存在しないため、エラーが発生しています。appはcreate_app()から生成されたインスタンスであり、create_app()を実行しない限りgunicornはapp属性を見つけられません。
【関連】FlaskやDjangoで使われるGunicornとは何か?
解決策
この場合、gunicornに対して正しいFlaskアプリケーションインスタンスを提供するためには、次のように実行する必要があります。
gunicorn app:create_app
これにより、create_app関数が呼び出され、Flaskアプリケーションインスタンスが正しく生成されます。
gunicorn app:create_appと指定することで、gunicornはappモジュールの中にあるcreate_app関数を呼び出し、その結果として生成されたFlaskアプリケーションインスタンスを使ってサーバーを立ち上げます。
この方法は、特に複雑な設定やBlueprintを使う場合に便利です。
まとめ
今回の記事では、Gunicorn実行時にFailed to find attribute ‘app’ in ‘app’.というエラーが出た時の対処方法について解説しました。
今回は、Blueprintを使った構成だったため、Gunicornの起動も少し異なる状況になりました。同じ状況で不具合が出た方は、今回の記事を参考にしてください。
今回の記事が何かのお役になれば幸いです。
ここまでお読みいただきありがとうございました。
Pythonの基礎から応用まで学べる
Python WebAcademy
Python WebAcademyでは、Pythonの基礎からアーキテクチャなどの応用的な内容まで幅広く学べます。また、ブラウザ上で直接Pythonコードを試すことができ、実践的なスキルを身につけることが可能です。
無料で試すインフラの学習はInfraAcademy
おすすめの記事