前提・実現したいこと
flaskで実装したwebアプリケーションをuWSGIで本番環境に構築しようとしています。
テストサーバでは正常に動作していたものが、本番(uWSGI)にデプロイするとうまく動作させることができずに困っています。
発生している問題・エラーメッセージ
実装の中でエラーハンドラの設定等を行なっています。
テストで例外を発生させてみたところ、本来エラーハンドラで処理されるはずのものがスルーされていました。
調べてみると、どうやら下記で __name__
に __main__
が渡されておらず、 app.run()
が実行されていませんでした。
python
1if __name__ == '__main__': 2 app.run()
デバッグしてみたところ、上記実装がされているファイル名が __name__
に渡されているようでした。
しかし、 app.run()
の中で行われているエラーハンドラ以外の通常の実装は正常に動作しており、状況がよくつかめていない状態です。
また、上記if文から app.run()
を外に出し、かならず実行されるようにしたところ、今度は app.run()
の箇所でブロッキングされるような状態になり、一切正常に動作しないようになりました。
該当のソースコード
app.py
python
1def create_app(): 2 app = Flask(__name__) 3 CORS(app) 4 5 app.register_error_handler(Exception, handle_internal_error) 6 7 api = Api(app) 8 api.add_resource(API, '/') 9 10app = create_app()
prod_server.py
本番でuWSGIから実行させようとしているプログラムです。
python
1from app import app 2 3 4if __name__ == '__main__': 5 app.run()
dev_server.py
開発環境で用いていたプログラムです。
こちらでは全て正常に動作しています。
python
1from app import app 2 3 4if __name__ == '__main__': 5 app.run(host='0.0.0.0', port=8080, debug=True)
uwsgi.ini
[uwsgi] pythonpath = /usr/local/hoge/ module = prod_server callable = app master = true processes = 1 socket = /var/run/uwsgi/uwsgi.sock chmod-socket = 666 vacuum = true die-on-term = true
試したこと
prod_server.py
で__name__
をデバッグしてみたところ、prod_server
が出力されました。prod_server.py
を直接実行してみたところ、__main__
が出力されました。prod_server.py
でapp.run()
をifの外に出してみましたが、そこでブロッキングされてしまって正常に動作しませんでした。
python
1from app import app 2 3 4app.run() 5#if __name__ == '__main__': 6# app.run()
補足情報(FW/ツールのバージョンなど)
bash
1$ flask --version 2Flask 1.0.2 3Python 3.6.7 (default, Dec 5 2018, 15:02:05) 4[GCC 4.8.5 20150623 (Red Hat 4.8.5-36)] 5 6$ uwsgi --version 72.0.18
あなたの回答
tips
プレビュー