connexion中实现after_request

本文介绍如何在代码中使用abord函数实现非标准HTTP响应,如将400状态转换为200并返回定制的detail内容,同时展示两种方法:@app.after_request装饰器和直接注册回调函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值