web-dev-qa-db-ja.com

フラスコ:青写真のerror_handler

ブループリントにerror_handlerを設定できますか?

@blueprint.errorhandler(404)
def page_not_found(error):
    return 'This page does not exist', 404

編集:

https://github.com/mitsuhiko/flask/blob/18413ed1bf08261acf6d40f8ba65a98ae586bb29/flask/blueprints.py

アプリ全体とブループリントローカルerror_handlerを指定できます

25
blueblank

次のようなBlueprint.app_errorhandlerメソッドを使用できます。

bp = Blueprint('errors', __name__)

@bp.app_errorhandler(404)
def handle_404(err):
    return render_template('404.html'), 404

@bp.app_errorhandler(500)
def handle_500(err):
    return render_template('500.html'), 500
27
suzanshakya

errorhandlerは、Blueprintではなく、Flaskから継承されたメソッドです。ブループリントを使用している場合、同等のものはapp_errorhandlerです。

ドキュメントは、次のアプローチを提案しています。

def app_errorhandler(self, code):
        """Like :meth:`Flask.errorhandler` but for a blueprint.  This
        handler is used for all requests, even if outside of the blueprint.
        """

したがって、これは機能するはずです。

from flask import Blueprint, render_template

USER = Blueprint('user', __name__)

@USER.app_errorhandler(404)
def page_not_found(e):
    """ Return error 404 """
    return render_template('404.html'), 404

一方、以下のアプローチではエラーは発生しませんでしたが、機能しませんでした。

from flask import Blueprint, render_template

USER = Blueprint('user', __name__)

@USER.errorhandler(404)
def page_not_found(e):
    """ Return error 404 """
    return render_template('404.html'), 404
6
T. Goncalves

私も最高評価の回答を得ることができませんでしたが、回避策は次のとおりです。

ブループリントのendでキャッチオールを使用できます。これがどれほど堅牢で推奨されているかはわかりませんが、機能します。メソッドごとに異なるエラーメッセージを追加することもできます。

@blueprint.route('/<path:path>')
def page_not_found(path):
    return "Custom failure message"
2
Jonathan Deakin

リクエストプロキシオブジェクトを使用して、アプリケーションレベルでエラー処理を追加します。

from flask import request,jsonify

@app.errorhandler(404)
@app.errorhandler(405)
def _handle_api_error(ex):
if request.path.startswith('/api/'):
    return jsonify(ex)
else:
    return ex

フラスコのドキュメント

0
swarup260