总览

我正在使用Flask-SqlAlchemy,现在我正在研究棉花糖,以帮助我序列化和反序列化请求数据。

我能够成功:


使用Flask-SqlAlchemy创建我的模型
使用Flask-Marshmallow通过Optional Flask-SqlAlchemy Integration使用相同的模型序列化数据库对象
使用marshmallow-jsonapi快速生成符合Json API的响应。这要求我declare new Schemas指定要包括的属性(与Flask-SqlAlchemy模型重复)


代码样本

Flask-SqlAlchemy声明性模型

class Space(db.Model):

    __tablename__ = 'spaces'
    id = sql.Column(sql.Integer, primary_key=True)
    name = sql.Column(sql.String)
    version = sql.Column(sql.String)
    active = sql.Column(sql.Boolean)


flask_marshmallow模式声明(继承自SqlAlchemy模型)

ma = flask_marshmallow.Marshmallow(app)

class SpaceSchema(ma.ModelSchema):
    class Meta:
        model = Space

# API Response
space = Space.query.first()
return SpaceSchema().dump(space).data

# Returns:
{
'id': 123,
'version': '0.1.0',
'name': 'SpaceName',
'active': True
}


marshmallow_json api-需要新的架构声明,必须包括每个属性并手动输入

class SpaceJsonSchema(marshmallow_json.Schema):
    id = fields.Str(dump_only=True)
    name = fields.Str()
    version = fields.Str()
    active = fields.Bool()

    class Meta:
        type_ = 'spaces'
        self_url = '/spaces/{id}'
        self_url_kwargs = {'id': '<id>'}
        self_url_many = '/spaces/'
        strict = True

# Returns Json API Compliant
{
    'data': {
        'id': '1',
        'type': 'spaces',
        'attributes': {
            'name': 'Phonebooth',
            'active': True,
            'version': '0.1.0'
         },
        'links': {'self': '/spaces/1'}
    },
    'links': {'self': '/spaces/1'}
}


问题

如代码中所示,marshmallow-jsonapi允许我创建符合json api的响应,但最终不得不维护声明式模型+模式响应模型。

flask-marshmallow允许我从SqlAlchemy模型创建Schema响应,因此不必为每个模型维护一组单独的属性。





可以同时使用flask-marshmallow和marshmallow-jsonapi吗?1.从SqlAlchemy模型创建棉花糖模式,并自动生成json api响应?

我尝试创建从ma.ModelSchemamarshmallow_json.Schema沿两个顺序继承的Schema声明,但是不起作用(引发缺少的方法和属性的异常)



marshmallow-jsonapi


marshmallow-jsonapi提供了一种生成JSON的简单方法
任何Python网络框架中符合API的数据。


flask-marshmallow


Flask-Marshmallow包含有用的附加功能,可与
Flask-SQLAlchemy和棉花糖-SQLalchemy。

最佳答案

不能解决这个确切的问题,但是在实现此库时遇到了类似的问题:https://github.com/thomaxxl/safrs(sqlalchemy + flask-restful + jsonapi兼容规范)。
我不记得确切的解决方法,但是如果您尝试使用它并且序列化不起作用,那么如果您在github中打开一个问题,我可以帮助您解决它

关于python - 将Flask-Marshmallow与marshmallow-jsonapi结合,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48602128/

10-12 21:08