Flask-Restless Marshmallow序列化器

时间:2015-06-23 16:42:47

标签: python sqlalchemy flask-sqlalchemy flask-restless

我尝试使用docs建议的 Marshmallow 的自定义反序列化器排除 Flask-Restless API中的列:

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中错误地设置了这个设置?

2 个答案:

答案 0 :(得分:3)

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

用户 itsrifat <​​/ em>提供了添加后处理器的解决方法:


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] } )

答案 1 :(得分:0)

Meta类应该在Schema类中。

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

 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)