想要实现在代码中任意位置直接响应而不用层层return,可以使用abord()函数,但abort函数仅能触发400、401等状态码,而200、402等等则会报错:“ERROR no exception for 402”。而且abord返回的数据格式固定,其中detail通过abord(400, description={‘code’: 4001, ‘data’: None …})确定。我们希望仍使用abord函数,但返回的状态码为200,且返回的数据仅为detail的内容。
{
'detail': {
'code': 4001,
'data': None,
'message': '该微信未绑定手机号',
'success': True
},
'status': 400,
'title': 'Bad Request',
'type': 'about:blank'
}
一个思路是通过after_request注册回调函数,在响应的时候触发该函数,再对response作修改
@app.after_request
def handle_exception(response):
if response.status_code == 400:
response.status_code = 200
response = jsonify(json.loads(response.data.decode('utf-8'))['detail'])
return response
但connexion也可以这样么?
经过验证,答案是肯定的
import connexion
app = connexion.App(__name__, specification_dir='./swagger/')
@app.app.after_request
def handle_exception(response):
if response.status_code == 400:
response.status_code = 200
response = jsonify(json.loads(response.data.decode('utf-8'))['detail'])
return response
...
还有一种不用装饰器的写法
import connexion
app = connexion.App(__name__, specification_dir='./swagger/')
def handle_exception(response):
if response.status_code == 400:
response.status_code = 200
response = jsonify(json.loads(response.data.decode('utf-8'))['detail'])
return response
app.app.after_request(handle_exception)
...
两种方式都可以,放心用
注:另外一种思路是使用errorhandler,但在connexion中验证失败了,如果你了解在connexion中如何使用的话,请不吝赐教
参考:
https://github.com/zalando/connexion/issues/793#issue-383899310
https://www.cnblogs.com/zwq-/p/10440233.html