You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Marshmallow Schema与webargs use_kwargs验证字典列表失败:Flask端点返回422 Unprocessable Entity错误

问题根源与解决方案

你的问题出在测试请求的发送方式上:当你用data={"measures": measures}发送请求时,Flask测试客户端会把数据以表单格式(application/x-www-form-urlencoded)传递,但表单格式无法正确处理嵌套的列表/字典结构——webargs解析表单数据时,会把嵌套的列表转换成字符串类型,而不是Marshmallow期望的Python列表,这就直接导致了Invalid input type的验证错误。

而直接用req_schema.validate(d)验证没问题,是因为你传递的是原生Python字典,Marshmallow可以直接处理这种结构,跳过了表单数据解析的“变形”环节。

修复方案

把测试中的data参数换成json参数,让请求以JSON格式发送:

def test_save(app):
    measures = [
        { "type": 1, "value": 2.2, "unit": 3, "date": 4, },
        { "type": 5, "value": 6.6, "unit": 7, "date": 8, },
    ]
    # 用json参数替代data,自动设置Content-Type为application/json
    r = app.post("/save", json={"measures": measures})
    assert r.status_code == 200

这样webargs会从JSON中解析出正确的嵌套列表结构,Marshmallow就能顺利验证通过了。

额外说明

如果你的业务场景确实需要支持表单格式传递嵌套数据,那需要额外处理表单数据的编码(比如用multipart/form-data配合特定格式),但这种方式远比JSON复杂。对于嵌套结构的请求,优先使用JSON格式传递是更简单可靠的选择。

内容的提问来源于stack exchange,提问作者vvvvv

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 20:57:42