如何在Cerberus中校验根键:禁止特定键名
如何用Cerberus禁止特定的非法键名?
我来帮你搞定这个Cerberus的校验问题!你之前的代码问题出在对allow_unknown的赋值方式上——Cerberus不支持直接给Validator实例的allow_unknown属性赋值那个字典格式的配置,得换正确的姿势来设置。
核心思路
Cerberus控制未知字段的规则,需要在Validator初始化时传入参数,或者在校验Schema里定义,两种方式都能实现你“禁止src、alsoBad这两个键”的需求。
方案1:初始化Validator时配置禁止字段
这种方式适合全局控制所有校验的未知字段规则:
from cerberus import Validator def check_data(type_data): # 初始化Validator时,直接指定禁止的未知键 val = Validator(allow_unknown={'forbidden': ['src', 'alsoBad']}) # 如果你需要校验name字段的格式(比如必须是字符串),可以定义对应的Schema schema = {'name': {'type': 'string'}} # 不需要校验name格式的话,直接传空字典{}就行 is_valid = val.validate(type_data, schema) # 打印错误信息方便调试 if not is_valid: print("校验失败:", val.errors) return is_valid
方案2:在Schema中定义禁止规则
如果只是针对某一类数据的校验需要这个规则,把allow_unknown写在Schema里更灵活:
from cerberus import Validator def check_data(type_data): schema = { 'name': {'type': 'string'}, # 可选:校验name必须是字符串 'allow_unknown': {'forbidden': ['src', 'alsoBad']} } val = Validator() is_valid = val.validate(type_data, schema) if not is_valid: print("校验失败:", val.errors) return is_valid
测试示例
非法数据(包含src):
check_data({'name': 'test', 'src': 'who cares this is wrong'})会返回
False,错误信息类似:{'src': ['field is not allowed']}合法数据(只有name):
check_data({'name': 'valid_string'})返回
True其他未知键(非禁止列表):
check_data({'name': 'test', 'other_key': 'allowed_value'})会返回
True——因为我们只禁止了src和alsoBad,其他未知键是允许的。如果需要只允许name这一个键,把allow_unknown设为False就行,这样任何未知字段(包括src、alsoBad)都会被拒绝。
内容的提问来源于stack exchange,提问作者Ray Salemi
相关产品推荐
相关产品推荐

