如何在 flask_smorest/marshmallow 中使用参数列表
How to use a list of arguments with flask_smorest/marshmallow
我正在尝试在烧瓶中插入一组对象 api。我们使用棉花糖进行反序列化。我的端点如下所示:
@blp.arguments(SomeSchemas, location='json', as_kwargs=True)
@blp.response(200, SomeSchemas)
def post(self, some_schemas: SomeSchemas) -> dict:
架构是一个像这样的简单架构:
class SomeSchemas(ma.Schema):
schemas = ma.fields.List(ma.fields.Nested(SomeSchema))
class SomeSchema(ma.Schema):
a = ma.fields.String()
b = ma.fields.Integer()
当我 post 到端点时,我确实得到了正确数据的列表,但它以字典的形式出现,而不是被正确地翻译成对象。
我也曾尝试明确使用对象列表(List[SomeSchema]、SomeSchema(many=True) 等),但我似乎无法弄明白。
我认为这是一个非常常见的用例(提供参数列表)并且我缺少一个明显的解决方案,但我似乎找不到关于如何正确执行此操作的任何参考。需要明确的是,我正在寻找使用列表(或其他一些集合类型,这无关紧要)调用端点的正确方法,并且已将列表正确反序列化并使用正确的对象类型。
免责声明:flask-smorest维护者发言。
我认为问题与输入是列表这一事实无关。
IIUC,你的问题是你在视图函数中注入了指令,而不是对象。这是棉花糖的默认行为。它可以通过使用 post_load
挂钩实际实例化对象在 marshmallow 中被覆盖。
我一般不会那样做。在实践中,我发现在视图函数中实例化对象会更好。例如,在 PUT 资源中,我更喜欢从 DB 实例化现有项目,然后用新数据更新它。在这种情况下,最好将新数据作为字典而不是对象。
可能没有一个真理,在这里,这可能是一个见仁见智的问题,但是虽然在装饰器中实例化对象并传递给视图的想法很吸引人,但它可能有点滥用快捷方式。
我知道这个答案是“不知道,但无论如何你都不应该这样做”的类型。只是说外行你不应该为实现这一目标而努力。
这就是说,如果它与 non-list / non-nested 输入一起工作,我会感到惊讶,我想知道为什么它在这种情况下不起作用。
我正在尝试在烧瓶中插入一组对象 api。我们使用棉花糖进行反序列化。我的端点如下所示:
@blp.arguments(SomeSchemas, location='json', as_kwargs=True)
@blp.response(200, SomeSchemas)
def post(self, some_schemas: SomeSchemas) -> dict:
架构是一个像这样的简单架构:
class SomeSchemas(ma.Schema):
schemas = ma.fields.List(ma.fields.Nested(SomeSchema))
class SomeSchema(ma.Schema):
a = ma.fields.String()
b = ma.fields.Integer()
当我 post 到端点时,我确实得到了正确数据的列表,但它以字典的形式出现,而不是被正确地翻译成对象。
我也曾尝试明确使用对象列表(List[SomeSchema]、SomeSchema(many=True) 等),但我似乎无法弄明白。
我认为这是一个非常常见的用例(提供参数列表)并且我缺少一个明显的解决方案,但我似乎找不到关于如何正确执行此操作的任何参考。需要明确的是,我正在寻找使用列表(或其他一些集合类型,这无关紧要)调用端点的正确方法,并且已将列表正确反序列化并使用正确的对象类型。
免责声明:flask-smorest维护者发言。
我认为问题与输入是列表这一事实无关。
IIUC,你的问题是你在视图函数中注入了指令,而不是对象。这是棉花糖的默认行为。它可以通过使用 post_load
挂钩实际实例化对象在 marshmallow 中被覆盖。
我一般不会那样做。在实践中,我发现在视图函数中实例化对象会更好。例如,在 PUT 资源中,我更喜欢从 DB 实例化现有项目,然后用新数据更新它。在这种情况下,最好将新数据作为字典而不是对象。
可能没有一个真理,在这里,这可能是一个见仁见智的问题,但是虽然在装饰器中实例化对象并传递给视图的想法很吸引人,但它可能有点滥用快捷方式。
我知道这个答案是“不知道,但无论如何你都不应该这样做”的类型。只是说外行你不应该为实现这一目标而努力。
这就是说,如果它与 non-list / non-nested 输入一起工作,我会感到惊讶,我想知道为什么它在这种情况下不起作用。