【问题标题】:Combine Flask-Marshmallow with marshmallow-jsonapi将 Flask-Marshmallow 与 marshmallow-jsonapi 结合使用
【发布时间】:2018-07-14 02:27:41
【问题描述】:

概述

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

我成功了:

  1. 使用 Flask-SqlAlchemy

  2. 创建我的模型
  3. 使用 Flask-Marshmallow 使用同一模型序列化数据库对象,方法是使用 Optional Flask-SqlAlchemy Integration

  4. 使用 ma​​rshmallow-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 Schema 声明(继承自 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 - 需要新的 Schema 声明,必须手动包含每个属性和类型

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'}
}

问题

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

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


问题

是否可以同时使用 flask-marshmallowma​​rshmallow-jsonapi 1. 从 SqlAlchemy 模型创建 Marshmallow Schema,AND 自动生成 json api 响应?

我尝试创建继承自 ma.ModelSchemamarshmallow_json.Schema 的 Schema 声明,在两个命令中,但它不起作用(引发缺少方法和属性的异常)


marshmallow-jsonapi

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

flask-marshmallow

Flask-Marshmallow 包含有用的附加功能,可与 Flask-SQLAlchemy 和 marshmallow-sqlalchemy。

【问题讨论】:

标签: python flask flask-sqlalchemy marshmallow


【解决方案1】:

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

【讨论】:

  • 感谢您的建议。我现在只是用 marshmallow_jsonapi 构建模式。事实证明,其中很多都需要一些调整才能与序列化器/反序列化器配合得很好,所以我不确定开箱即用的解决方案是否能解决它。
猜你喜欢
  • 1970-01-01
  • 2017-06-08
  • 1970-01-01
  • 2019-04-15
  • 2021-06-27
  • 2021-08-04
  • 1970-01-01
  • 2019-10-31
  • 2015-09-09
相关资源
最近更新 更多