我正在使用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与“龙卷风”服务器配合使用。
先谢谢了。 汤姆
答案 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
您可以轻松地将其更改为格式。