【问题标题】:Flask-Restless Marshmallow serializerFlask-Restless Marshmallow 序列化器
【发布时间】:2015-09-09 14:21:02
【问题描述】:

我正在尝试使用带有 Marshmallow 的自定义反序列化器排除 Flask-Restless API 中的列,正如docs 所建议的那样:

serializers.py

class HeatSchema(Schema):
    id = fields.Integer()
    heat_index = fields.Integer()
    updated_at = fields.DateTime()

class Meta:
    exclude = ('updated_at',)

def make_object(self, data):
    print 'Making object from', data
    return Heat(**data)

server.py

from serializers import HeatSchema

heat_schema = HeatSchema()

def heat_serializer(instance):
    return heat_schema.dump(instance).data

def heat_deserializer(data):
    return heat_schema.load(data).data

apimanager = APIManager(app, flask_sqlalchemy_db=db)

apimanager.create_api(
    heat,
    methods=['GET'],
    url_prefix='/api/v1',
    collection_name='heat',
    results_per_page=10,
    serializer=heat_serializer,
    deserializer=heat_deserializer
)

无论我对 Heat 模式做什么,我都会从 API 获得相同的响应。我可以放

blahblah = fields.Integer()

没有任何变化。调试时我什至无法在序列化程序中遇到断点,所以我假设我的 Flask-Restless 设置不正确?

【问题讨论】:

    标签: python sqlalchemy flask-sqlalchemy flask-restless


    【解决方案1】:

    我也遇到了同样的问题。 似乎该行为仅出现在 GET_MANY 函数中。 如果您尝试获取单个对象实例,它应该符合棉花糖模式。 这是 Flask-restless bug tracker 上报告的一种奇怪行为: https://github.com/jfinkels/flask-restless/issues/167

    用户 itsrifat 提供了添加后处理器的解决方法:

    
    person_schema = PersonSchema()
    
    

    def person_deserializer(data): return person_schema.load(data).data

    def person_after_get_many(result=None, search_params=None, **kw): result['objects'] = [person_deserializer(obj) for obj in result['objects']]

    apimanager.create_api(Person,methods=['GET', 'POST','PUT', 'DELETE'], postprocessors={ 'GET_MANY':[person_after_get_many] } )

    【讨论】:

    【解决方案2】:

    Meta 类应该在 Schema 类中。

    元:是将配置添加到架构类的位置。

     class HeatSchema(Schema):
         id = fields.Integer()
         heat_index = fields.Integer()
         updated_at = fields.DateTime()
    
         class Meta:
             exclude = ('updated_at',)
    
         def make_object(self, data):
             print 'Making object from', data
             return Heat(**data)
    

    【讨论】:

      猜你喜欢
      • 2016-11-14
      • 2015-03-02
      • 2021-06-27
      • 1970-01-01
      • 2013-10-16
      • 2020-02-11
      • 1970-01-01
      • 2023-03-13
      • 2015-10-14
      相关资源
      最近更新 更多