connexion中实现after_request

想要实现在代码中任意位置直接响应而不用层层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


版权声明:本文为MacwinWin原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。