【Python】Flask + PyCharm でいい感じにデバッグする方法
# pycharm # pytest # python
やりたいこと
Flaskでapp.runを実行して例外が発生した際にブレークポイントで止まるようにしたい。
PythonのWebフレームワークDjangoの場合は、最強のPython開発環境として名高いPyCharmらしく開発が強力に支援されています。
そのうちの1つが、Djangoのビューなどでエラー発生時にエラー発生個所にブレークポイントを張れる機能(Django Exception Breakpoint)です。 この設定をONにすると、通常のPythonスクリプトでの例外発生時と同様にエラーで止まってくれるようになります。 (runserverを使って起動している際は、全体をtry~except文で囲っているようなものなので通常のPython Exception Breakpointでは止まりません。)
FlaskもメジャーなWebフレームワークになってはいますが、まだここら辺までは対応してくれていないようです…。 なので自分でやったりましょう。
環境
Python==3.8.1
Flask==1.1.1
Werkzeug==1.0.0
Flask版例外Breakpointの設定
Flask版例外Breakpointの設定とはいいつつも、残念ながらPyCharmにそんなオプションはないのでせっせと設定を書いてあげる必要があります。
行きついた先はそれなりにシンプルでしたが情報があまりなかったり古かったりで地味に時間がかかってしまいました…。
host = 'localhost'
port = '5000'
app.config['PROPAGATE_EXCEPTIONS'] = True
app.run(host=host, port=port, debug=False, passthrough_errors=True, use_reloader=True)
細かくは以下となります。
- configのPROPAGATE_EXCEPTIONSをTrueに設定する … この設定を行うとFlask内でエラーをハンドリングした後に、再度raiseしてPyCharm等に届くようにしてくれるようです。
- debug=Falseで起動する …細かくはわかっていないですがTrueではダメでした。多分エラー用のhtmlを生成してレスポンスしてるからそれでエラーでキャッチ出来なくなっているみたい。
- passthrough_errors=True のパラメーターを追加する …Flaskの内部で読んでいるWerkzeugの設定です。こちらもPyCharm等までエラーが届くようにする設定です。
- use_reloader=Trueのパラメータを追加する …これもFlaskの内部で読んでいるWerkzeugの設定です。debug=Falseでもコード変更時にリロードがかかるようになります。
PROPAGATE_EXCEPTIONSをTrueにしただけで良しなにやってほしいですが、ここら辺はマイクロフレームワークらしさというか何というか…。 作られた時代があるので仕方ない気はしますが、Flaskは手軽だけどいろいろ手が回らない印象の割にhtmlのレスポンスは手厚い印象があるのがちょっと時代から外れてきている感じがしますね。
FastAPI使いたいFastAPI。