Flask のエラーハンドリングとカスタムエラーページ

Flask ではエラー発生時の動作をカスタマイズできる。404 や 500 などの HTTP エラーに対して、独自のエラーページを表示することが可能である。

エラーハンドラの登録

@app.errorhandler デコレータでエラーハンドラを登録する。

from flask import Flask, render_template

app = Flask(__name__)

@app.errorhandler(404)
def page_not_found(error):
    return render_template('errors/404.html'), 404

@app.errorhandler(500)
def internal_server_error(error):
    return render_template('errors/500.html'), 500

ハンドラ関数はエラーオブジェクトを受け取り、レスポンスとステータスコードを返す。ステータスコードを明示的に返さないと 200 になってしまうので注意が必要である。

エラーテンプレートの例

<!-- templates/errors/404.html -->
<!DOCTYPE html>
<html>
<head>
    <title>Page Not Found</title>
</head>
<body>
    <h1>404 - Page Not Found</h1>
    <p>The page you are looking for does not exist.</p>
    <a href="/">Go back to home</a>
</body>
</html>

abort によるエラー発生

意図的にエラーを発生させるには abort 関数を使う。

from flask import abort

@app.route('/admin')
def admin():
    if not current_user.is_admin:
        abort(403)
    return 'Admin page'

abort(403) を呼ぶと、処理が中断されて 403 エラーハンドラが実行される。

例外クラスのハンドリング

HTTP エラーコードだけでなく、Python の例外クラスもハンドリングできる。

@app.errorhandler(ValueError)
def handle_value_error(error):
    return {'error': str(error)}, 400

Blueprint でのエラーハンドラ

Blueprint にもエラーハンドラを登録できる。ただし、Blueprint のエラーハンドラはその Blueprint 内で発生したエラーにのみ適用される。

from flask import Blueprint

api_bp = Blueprint('api', __name__)

@api_bp.errorhandler(404)
def api_not_found(error):
    return {'error': 'Resource not found'}, 404

アプリケーション全体に適用するエラーハンドラは app.errorhandler で登録する。