如何在Cerberus中为empty参数设置动态条件验证?
Cerberus条件化empty参数验证解决方案
问题场景
现有如下Cerberus Schema:
schema = { 'param1': {'type': 'string', 'empty': False, 'required': True, 'allowed': ['One', 'Two']}, 'param2': {'type': 'string', 'empty': False, 'required': True} }
需求是:当param1的值为'One'时,param2允许为空(即empty: True);当param1为其他值(如'Two')时,param2不允许为空(即empty: False)。
直接尝试在empty字段中使用条件逻辑会报错:
'param2': {'type': 'string', 'empty': {'if': {'param1': 'One'}, 'then': True, 'else': False}, 'required': True}
错误信息:[{'empty': ['must be of boolean type']}],原因是Cerberus内置的empty参数仅接受布尔值,不支持嵌套的条件表达式。
可行解决方案:自定义验证函数
Cerberus支持通过继承Validator类实现自定义验证规则,以此来处理依赖其他字段的条件验证逻辑。
步骤1:定义自定义验证器
创建继承自cerberus.Validator的子类,实现针对param2的空值验证逻辑:
from cerberus import Validator class CustomValidator(Validator): def validate_param2_empty(self, field, value): # 获取param1的值,判断是否允许param2为空 if self.document.get('param1') == 'One': # param1为'One'时,param2允许为空 return True else: # param1不为'One'时,param2必须非空(去除首尾空格后长度大于0) return len(value.strip()) > 0
步骤2:修改Schema使用自定义规则
将原来的empty参数替换为自定义验证规则:
schema = { 'param1': {'type': 'string', 'empty': False, 'required': True, 'allowed': ['One', 'Two']}, 'param2': { 'type': 'string', 'required': True, 'param2_empty': True # 启用自定义验证规则 } }
步骤3:测试验证逻辑
# 测试用例1:param1为'One',param2为空 → 验证通过 validator = CustomValidator(schema) doc1 = {'param1': 'One', 'param2': ''} print(validator.validate(doc1)) # 输出: True print(validator.errors) # 输出: {} # 测试用例2:param1为'Two',param2为空 → 验证失败 doc2 = {'param1': 'Two', 'param2': ''} print(validator.validate(doc2)) # 输出: False print(validator.errors) # 输出: {'param2': ['param2_empty failed']}
可选:自定义错误提示
为了让错误信息更直观,可以在Schema中给自定义规则添加提示消息:
'param2': { 'type': 'string', 'required': True, 'param2_empty': {'message': '当param1为"Two"时,param2不能为空'} }
此时验证失败时的错误信息会变为:{'param2': ['当param1为"Two"时,param2不能为空']}
内容的提问来源于stack exchange,提问作者user388794
相关产品推荐
相关产品推荐

