将Flask-Marshmallow与marshmallow-jsonapi结合使用

3

概述

我正在使用Flask-SqlAlchemy,现在我正在查看marshmallow以帮助我序列化和反序列化请求数据。

我已经成功地做到了:

  1. 使用Flask-SqlAlchemy创建我的模型

  2. 使用Flask-Marshmallow使用相同的模型序列化数据库对象,通过使用可选的Flask-SqlAlchemy集成

  3. 使用marshmallow-jsonapi快速生成Json API兼容的响应。这要求我声明新架构来指定我想要包括哪些属性(这是从Flask-SqlAlchemy Models中复制的)

代码示例

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的Schema声明(继承自SqlAlchemy Model)

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 模型创建模式响应,因此我不必为每个模型维护一组单独的属性。


问题

是否有可能同时使用 flask-marshmallowmarshmallow-jsonapi 来 1. 从 SqlAlchemy 模型创建 Marshmallow 模式,并且 自动生成 json api 响应?

我尝试创建继承自 ma.ModelSchemamarshmallow_json.Schema 的模式声明,两种顺序都试过,但它不能工作(引发缺少方法和属性的异常)


marshmallow-jsonapi

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

flask-marshmallow

Flask-Marshmallow 包括与 Flask-SQLAlchemy 和 marshmallow-sqlalchemy 集成的有用增强功能。


看起来在Python中可以进行多重继承,例如:class MyClass(Schema, SQLAlchemyAutoSchema): https://docs.sqlalchemy.org/en/13/orm/extensions/declarative/mixins.html#mixin-and-custom-base-classes我现在也在尝试让它工作。 - MoralCode
1
好像已经有其他人做了... https://dev59.com/P53ha4cB1Zd3GeqPcfqo#53035144 - MoralCode
1个回答

0

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


谢谢你的建议。我最终决定暂时使用marshmallow_jsonapi来构建模式。结果发现很多模式需要进行一些调整,以便与序列化/反序列化器协同工作,所以我不确定一个开箱即用的解决方案是否能解决这个问题。 - gtalarico

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接