Flask-Restless Marshmallow 序列化器
Flask-Restless Marshmallow serializer
我试图按照建议使用带有 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 的设置不正确?
我也遇到了同样的问题。
似乎该行为仅出现在 GET_MANY 函数中。
如果您尝试获取单个对象实例,它应该符合棉花糖模式。
这是 Flask-restless bug tracker 上报告的一种奇怪行为:
https://github.com/jfinkels/flask-restless/issues/167
用户 itsrifat 提供了添加后处理器的解决方法:
<code>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]
}
)
Meta class 应该在 Schema class 内。
Meta:是将配置添加到架构的地方 class。
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)
我试图按照建议使用带有 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 的设置不正确?
我也遇到了同样的问题。 似乎该行为仅出现在 GET_MANY 函数中。 如果您尝试获取单个对象实例,它应该符合棉花糖模式。 这是 Flask-restless bug tracker 上报告的一种奇怪行为: https://github.com/jfinkels/flask-restless/issues/167
用户 itsrifat 提供了添加后处理器的解决方法:
<code>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]
}
)
Meta class 应该在 Schema class 内。
Meta:是将配置添加到架构的地方 class。
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)