Python中如何在flask-restplus框架中使用marshmallow进行序列化?
可以用过下面方式定义不同的类型——
A= news_api.model(‘A’, {
‘content’: fields.Integer(required=True, description=’’),
‘type’: fields.String(required=True, default=‘a’),
})
B= news_api.model(‘B’, {
‘content’: fields.Integer(required=True, description=’’),
‘type’: fields.String(required=True, default=‘b’’),
})
C= news_api.model(‘C’, {
‘content’: fields.Integer(required=True, description=’’),
‘type’: fields.String(required=True, default=‘c’),
})
A B C 类型的主要区别在 ‘ type ’字段,type 分别指定是 a b c
我的问题是,如何定义一个类,可以校验如下的 json 数据:
{
“data”:[
{A},
{B},
{C}
]
}
Python中如何在flask-restplus框架中使用marshmallow进行序列化?
没有人在开发中使用 marshmallow 吗?
在Flask-RESTPlus里直接用marshmallow确实有点绕,因为RESTPlus自己有套序列化机制。不过可以这么搞:
from flask import Flask
from flask_restplus import Api, Resource, fields
from marshmallow import Schema, fields as ma_fields
from functools import wraps
app = Flask(__name__)
api = Api(app)
# 1. 先定义marshmallow的Schema
class UserSchema(Schema):
id = ma_fields.Integer()
name = ma_fields.String()
email = ma_fields.Email()
# 2. 创建对应的RESTPlus模型(为了Swagger文档)
user_model = api.model('User', {
'id': fields.Integer,
'name': fields.String,
'email': fields.String
})
# 3. 写个装饰器把marshmallow序列化结果转成字典
def marshal_with_schema(schema):
def decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
result = func(*args, **kwargs)
return schema.dump(result)
return wrapper
return decorator
# 4. 在路由里使用
@api.route('/user')
class UserResource(Resource):
@api.marshal_with(user_model) # 这个只是为了生成Swagger文档
@marshal_with_schema(UserSchema()) # 这个才是实际处理数据的
def get(self):
# 模拟数据
user_data = {'id': 1, 'name': '张三', 'email': 'zhangsan@example.com'}
return user_data
if __name__ == '__main__':
app.run(debug=True)
关键点:
- 用装饰器把marshmallow的序列化结果转成字典
- RESTPlus的
@api.marshal_with只用来生成Swagger文档 - 实际数据处理交给marshmallow,这样能复用已有的marshmallow schema
如果不想用装饰器,也可以在方法里直接调用schema.dump(data)。
建议直接上Flask-Marshmallow扩展,省事。
原先这样设计的不对,换了设计当时解决了

