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进行序列化?


3 回复

没有人在开发中使用 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)

关键点:

  1. 用装饰器把marshmallow的序列化结果转成字典
  2. RESTPlus的@api.marshal_with只用来生成Swagger文档
  3. 实际数据处理交给marshmallow,这样能复用已有的marshmallow schema

如果不想用装饰器,也可以在方法里直接调用schema.dump(data)

建议直接上Flask-Marshmallow扩展,省事。

原先这样设计的不对,换了设计当时解决了

回到顶部