使用Flask构建REST API时报ValueError: not enough values to unpack错误
问题根因
你遇到的报错是Marshmallow大版本API不兼容导致的:
你参考的2019年《Building REST APIs with Flask》书籍示例基于Marshmallow 2.x版本开发,该版本中dump()方法会返回(序列化结果, 错误信息)二元组,所以示例代码用两个变量接收返回值。
而你当前使用的Marshmallow 3.13.0属于3.x版本,该版本做了不兼容的API调整:
dump()方法仅返回序列化后的结果,不再附带错误信息返回值- 校验逻辑被统一剥离到
load()、validate()方法中,序列化(dump)阶段不会产生业务校验错误,不需要额外处理错误返回值
你还按2.x的写法尝试解包两个返回值,自然会触发expected 2, got 0的解包错误。
解决方案
直接修改视图函数中的序列化代码即可:
将原代码:
authors, error = author_schema.dump(fetched)
修改为:
authors = author_schema.dump(fetched)
如果需要做入参校验,调用schema.load()方法即可,该方法会在校验失败时主动抛出ValidationError,你捕获异常后做对应错误返回即可。
如果要完全对齐书籍的2.x版本代码逻辑,也可以降级依赖版本,但不推荐该方案,3.x是当前官方维护的主流版本,包含安全更新和性能优化。
内容的提问来源于stack exchange,提问作者Danny Falco
相关产品推荐
相关产品推荐

