Flask-Smorest接口返回类型与响应Schema不匹配问题咨询
Flask-Smorest 响应严格校验实现方案
要解决返回结构与Schema不匹配却未报错的问题,不需要自行编写大量校验代码,通过Flask-Smorest和Marshmallow的内置配置即可实现严格校验,具体步骤如下:
1. 开启Flask-Smorest全局响应验证
Flask-Smorest默认关闭响应校验,只需在Flask应用配置中开启VALIDATE_RESPONSES,框架会自动用指定的Marshmallow Schema校验响应数据:
from flask import Flask from flask_smorest import Api app = Flask(__name__) # 开启响应校验 app.config["VALIDATE_RESPONSES"] = True api = Api(app)
开启后,当返回数据的结构与响应装饰器指定的Schema不匹配时(比如返回列表但Schema是单个对象),会直接抛出ValidationError,不会返回错误的"有效响应"。
2. 正确匹配Schema与返回数据类型
确保响应装饰器中使用的Schema和实际返回数据类型一致:
- 返回单个对象:使用
ChildAddressDetailsSchema - 返回对象列表:使用
ChildAddressDetailsSchema(many=True)
示例代码:
from flask_smorest import Blueprint from marshmallow import Schema, fields blp = Blueprint("addresses", __name__) class ChildAddressDetailsSchema(Schema): id = fields.Int(required=True) street = fields.Str(required=True) # 返回单个地址的接口 @blp.route("/child-address/<int:id>") @blp.response(200, ChildAddressDetailsSchema) def get_single_child_address(id): return {"id": id, "street": "Test Street"} # 返回地址列表的接口 @blp.route("/child-addresses") @blp.response(200, ChildAddressDetailsSchema(many=True)) def get_child_addresses(): return [{"id": 1, "street": "Test St"}, {"id": 2, "street": "Another St"}]
3. 增强Marshmallow Schema的严格性
如果需要校验响应中是否存在Schema未定义的字段,可以在Schema的Meta类中设置unknown参数:
class ChildAddressDetailsSchema(Schema): id = fields.Int(required=True) street = fields.Str(required=True) class Meta: # 遇到Schema未定义的字段时直接抛出错误 unknown = "raise"
这样即使返回数据结构匹配,但包含多余字段时,也会触发校验错误。
内容的提问来源于stack exchange,提问作者Deepak_Spark_Beginner
相关产品推荐
相关产品推荐

