36

可以为蓝图设置 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

4

7 回答 7

42

你可以使用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
于 2013-11-13T10:17:56.637 回答
13

errorhandler是继承自 Flask 的方法,而不是 Blueprint。如果您使用的是蓝图,则等效为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
于 2019-09-22T20:12:23.553 回答
2

使用请求代理对象在应用程序级别添加错误处理:

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

烧瓶文档

于 2018-05-13T16:32:35.133 回答
2

我也无法获得最高评价的答案,但这里有一个解决方法。

您可以在蓝图的末尾使用包罗万象,不确定它有多强大/推荐,但它确实有效。您也可以为不同的方法添加不同的错误消息。

@blueprint.route('/<path:path>')
def page_not_found(path):
    return "Custom failure message"
于 2016-09-29T12:39:54.230 回答
0

为了提供更通用的方法,我将以前的优秀 答案与 Flask 的官方文档中的“以 JSON 形式返回 API 错误”部分结合起来。

这是一个有效的 PoC,您可以将其复制并粘贴到您注册的蓝图 API 路由处理程序(例如app/api/routes.py):

@blueprint.app_errorhandler(HTTPException)
def handle_exception(e):
"""Return JSON instead of HTML for HTTP errors."""
# start with the correct headers and status code from the error
response = e.get_response()
# replace the body with JSON
response.data = json.dumps({
    "code": e.code,
    "name": e.name,
    "description": e.description,
})
response.content_type = "application/json"
return response
于 2021-11-15T10:30:24.027 回答
0

惊讶的其他人没有提到 miguelgrinberg 的优秀教程。

https://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-vii-error-handling

我找到了用于错误处理的哨兵框架(下面的链接)。似乎过于复杂。不确定它变得有用的阈值。

https://flask.palletsprojects.com/en/1.1.x/errorhandling/

https://docs.sentry.io/platforms/python/guides/flask/

于 2020-10-17T21:23:01.520 回答
-8

Flask不支持 404 和 500 错误的蓝图级错误处理程序。蓝图是一种泄漏的抽象。最好为此使用新的 WSGI 应用程序,如果您需要单独的错误处理程序,这更有意义。

另外我建议不要使用烧瓶,它在所有地方都使用全局变量,如果它变得更大,这会使你的代码难以管理。

于 2016-02-10T14:55:49.163 回答