如何使用Connexion + Tornado更改所有错误的错误格式

时间:2019-03-07 22:14:36

标签: python flask error-handling connexion

我正在使用Connexion(https://github.com/zalando/connexion)来确保遵循我的openapi规范,并具有易于集成的点来将我的路由连接到基础函数。

无论如何,Connexion的默认错误响应是遵循 Problem Details for HTTP APIs RFC的json响应。这是以下格式,例如:

{
    "detail": "None is not of type 'object'",
    "status": 404,
    "title": "BadRequest",
    "type": "about:blank"
}

但是,我想将所有错误的格式更改为:

{
    error: {
        code: 400,
        message: 'BadRequest',
        detail: 'ID unknown'
        innererror: {...}
    }
}

我找不到任何方法来拦截每个错误以更改返回内容的格式。我知道我可以扩展connection.exception.ProblemException类并向其构造函数中的ext参数添加字典,但是对于任何400错误,例如,我都无法拦截。

因此,我知道可以为特定的错误代码添加错误处理程序,例如:

app.add_error_handler(404, error.normalize)
app.add_error_handler(400, error.normalize)

但是,对于404处理程序,我设法成功拦截了该错误。但是对于400(例如json验证错误)-拦截无效。

我如何拦截从Connexion发送的每个错误并更改json格式,即使只是像这样扩展它:

{
    "detail": "Could not find page",
    "error": {
        "code": 404,
        "message": "Could not find requested document."
    },
    "status": 404,
    "title": "NotFound",
    "type": "about:blank"
}

我将Connexion与“龙卷风”服务器配合使用。

先谢谢了。 汤姆

1 个答案:

答案 0 :(得分:2)

使用最新版本(connexion == 2.5.1),它对我有用:

from connexion import ProblemException
[...]

connexion_app.add_error_handler(400, render_http_exception)
connexion_app.add_error_handler(404, render_http_exception)
connexion_app.add_error_handler(ProblemException, render_problem_exception)

我的异常处理功能:

from flask import jsonify


def render_http_exception(error):

    resp = {
        'error': {
            'status': error.name,
            'code': error.code,
            'message': error.description,
        }
    }

    return jsonify(resp), error.code


def render_problem_exception(error):

    resp = {
        'error': {
            'status': error.title,
            'code': error.status,
            'message': error.detail,
        }
    }

    return jsonify(resp), error.status

您可以轻松地将其更改为格式。