Flask中使用Flask-RESTPlus Swagger定义数组结构API模型
没问题,我来帮你搞定这个Flask-RESTPlus里的数组请求体模型定义。咱们可以通过**嵌套模型(Nested Model)结合列表字段(List Field)**来实现你要的结构,具体步骤如下:
1. 导入必要的模块
首先确保你已经导入了Flask-RESTPlus的核心组件:
from flask import Flask from flask_restplus import Api, Resource, fields
2. 定义子模型(Product的结构)
因为你的product字段是一个数组,每个元素都有固定的结构,所以先定义单个产品的子模型:
app = Flask(__name__) api = Api(app, version='1.0', title='订单API', description='处理订单提交的API') # 定义单个产品的模型 product_model = api.model('Product', { 'product_id': fields.Integer(required=True, description='产品ID'), 'total_price': fields.Float(required=True, description='该产品的总价'), 'quantity': fields.Integer(required=True, description='产品数量') })
这里我给每个字段加上了required=True和描述,你可以根据实际需求调整是否必填。
3. 定义父模型(包含user_id和product数组)
接下来定义包含user_id和product数组的顶层模型,用fields.List(fields.Nested(product_model))来表示数组结构:
# 定义订单请求体的顶层模型 order_request_model = api.model('OrderRequest', { 'user_id': fields.Integer(required=True, description='用户ID'), 'product': fields.List(fields.Nested(product_model), required=True, description='产品列表') })
这里的fields.List用来指定这是一个数组类型,里面的元素就是咱们刚才定义的product_model。
4. 在POST接口中使用这个模型
最后,在你的POST接口里通过@api.expect(order_request_model)来绑定请求体模型,这样Swagger文档就会自动生成对应的请求体格式了:
@api.route('/submit-order') class OrderSubmit(Resource): @api.expect(order_request_model, validate=True) @api.response(201, '订单提交成功') def post(self): # 获取请求体数据 data = api.payload # 这里可以写你的数据库操作逻辑,比如保存user_id和产品列表到数据库 user_id = data['user_id'] products = data['product'] # 示例返回 return { 'message': '订单提交成功', 'user_id': user_id, 'products': products }, 201 if __name__ == '__main__': app.run(debug=True)
这里的validate=True会自动帮你验证请求体的格式是否符合模型定义,不符合的话会返回400错误,非常实用。
效果说明
启动你的Flask应用后,访问Swagger文档页面(默认是http://localhost:5000/swagger),你会看到/submit-order的POST接口里,请求体的格式完全符合你给出的结构:
{ "user_id" : 3, "product" : [ { "product_id" : 33, "total_price" : 50, "quantity": 2 }, { "product_id" : 18, "total_price" : 40, "quantity": 2 } ] }
而且Swagger还会提供交互式的测试功能,你可以直接在页面上提交符合格式的数据进行测试。
内容的提问来源于stack exchange,提问作者Lama Madan

