将Flask-Marshmallow与棉花糖-jsonapi混合

时间:2018-02-03 21:13:58

标签: python flask flask-sqlalchemy marshmallow

概述

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

我成功了:

  1. 使用 Flask-SqlAlchemy

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

  4. 使用 marshmallow-jsonapi 快速生成符合Json API的响应。这要求我declare new Schemas指定我想要包含的属性(这是Flask-SqlAlchemy模型中的重复)

  5. 代码示例

    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 - 需要新的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'}
    }
    

    问题

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

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

    问题

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

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

    marshmallow-jsonapi

      

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

    flask-marshmallow

      

    Flask-Marshmallow包含用于集成的有用附加功能   Flask-SQLAlchemy和marshmallow-sqlalchemy。

1 个答案:

答案 0 :(得分:0)

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