如何在 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 输入一起工作,我会感到惊讶,我想知道为什么它在这种情况下不起作用。