Flask: errorhandler(Exception)が404も捕まえてしまう
Flask 1.0以降でグローバル例外ハンドラが404 Not Foundも処理してしまう問題の解決策
概要
Flask 0.12から1.0にアップグレードすると、@app.errorhandler(Exception)で登録したグローバル例外ハンドラが404 Not Foundなどの HTTPException も捕まえるようになる問題。Flask 1.0での仕様変更が原因です。
エラーメッセージ
エラーメッセージは出ませんが、存在しないURLにアクセスすると404ではなく500が返ります。
| |
原因
- Flask 1.0の仕様変更:
HTTPExceptionがExceptionのサブクラスとして扱われるようになった - グローバルハンドラの挙動:
@errorhandler(Exception)が全ての例外を捕捉 - 404/405等も対象: NotFound、MethodNotAllowedなどもExceptionを継承
問題のあるコード
| |
解決策
1. HTTPExceptionを除外する(推奨)
| |
2. 特定の例外クラスのみ処理する
| |
3. HTTPExceptionのサブクラスを個別に処理
| |
4. Flask 1.1以降: trap_http_exceptions設定
| |
Flask バージョン別の挙動
| バージョン | @errorhandler(Exception)の挙動 |
|---|---|
| 0.12以前 | HTTPExceptionは捕捉しない |
| 1.0〜1.0.x | HTTPExceptionも捕捉する |
| 1.1以降 | HTTPExceptionも捕捉する(設定で変更可) |
APIでJSON応答を返す場合
| |
よくある間違い
HTTPExceptionをインポートせずにisinstance判定する- Flask 0.12のコードをそのまま1.0に移植する
- 404のテストを書かずにアップグレードする
参考リンク
関連エラー
関連エラー
Python の他のエラー
この記事は役に立ちましたか?