使用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
相关产品推荐
相关产品推荐

