使用Cerberus校验顶层字典列表时的报错问题问询
Cerberus校验顶层字典列表的正确实现方式
错误原因说明
- 第一个
cerberus.validator.DocumentError报错:Cerberus默认期望待校验的输入是字典结构,直接传入列表会触发类型不匹配错误。 - 第二个
cerberus.schema.SchemaError报错:Cerberus的默认Schema结构要求顶层是字段规则映射(字典格式),如果直接将顶层规则写为{"type": "list"},Cerberus会将其识别为「名为type的字段的校验规则」,而规则值要求必须是字典,因此触发报错。
正确校验方案
方案1:调用validate方法时传入顶层列表规则(推荐)
不需要对原始数据做任何包装,在校验时直接将列表规则作为validate方法的第二个参数传入即可,适配Cerberus 1.2及以上版本:
from cerberus import Validator # 定义列表内部单个字典元素的校验规则 item_schema = { "key": {"type": "string", "required": True} # 可自行扩展其他字段的校验规则 } # 定义顶层列表的校验规则 list_schema = { "type": "list", "schema": { "type": "dict", "schema": item_schema }, # 可补充列表维度的校验规则,比如最小/最大长度 "minlength": 1, "maxlength": 100 } v = Validator() # 直接传入待校验的顶层列表,第二个参数传入列表规则 is_valid = v.validate([{"key": "value"}, {"key": "value2"}], list_schema) if not is_valid: # 打印校验错误信息 print(v.errors)
方案2:包装为临时字典校验
如果需要兼容旧版本Cerberus,可以将待校验列表包装为一个临时字典的字段值,再定义对应字段的规则:
from cerberus import Validator item_schema = { "key": {"type": "string", "required": True} } # 定义包装字段的校验规则 schema = { "data": { "type": "list", "schema": {"type": "dict", "schema": item_schema}, "minlength": 1 } } v = Validator(schema) # 把待校验列表包装到data字段中 is_valid = v.validate({"data": [{"key": "value"}, {"key": "value2"}]}) if not is_valid: # 错误信息会放在data键下 print(v.errors["data"])
临时方案说明
你当前使用的遍历逐个校验的方案也可正常使用,适合需要单独统计每个元素错误的场景,性能上和上述通用方案差异不大。
内容的提问来源于stack exchange,提问作者Shoo
相关产品推荐
相关产品推荐

