cerberus:禁止现场存在
cerberus: forbid field existance
我想使用 Cerberus 验证对象中是否不字段。
我想使用类似的东西:
my_schema = {
'normal_field': {
'type': 'string',
},
'forbidden_field': {
'forbid': True,
},
}
基本上,我不想接受 forbidden_field
附带的对象。现在我接受更改我的验证器:
validator.allow_unknown = False
这基本上可以设置仅包含 "allowed" 字段的模式,但我真的不喜欢它的作用,因为这禁止我接受其他字段,而不仅仅是 forbidden_field
.
我也看到了allowed
和forbidden
验证规则,但是他们检查的是字段的值,而不是真正存在的字段。
那么,我如何告诉我的验证器只禁止 Cerberus 存在特定字段?
我似乎记得以前遇到过这个特定的用例。您可以尝试以下操作:
from cerberus import Validator
schema = {
'foo': {
'type': 'string',
'validator': lambda field, value, error: error(field, 'field is forbidden!!'),
}
}
v = Validator(schema)
v.allow_unknown = True
doc = {
'foo': 'bar'
}
print(v.validate(doc))
结果应该是 return False
和 v.errors
应该是 "field is forbidden!!"
见:
我使用 readonly
规则解决了这个问题,该规则还允许我设置 default_setter
值。
@kchan 的回答适用于不允许该字段,但它破坏了规范化集成(例如尝试将其与 default_setter
一起使用)。
我想使用 Cerberus 验证对象中是否不字段。
我想使用类似的东西:
my_schema = {
'normal_field': {
'type': 'string',
},
'forbidden_field': {
'forbid': True,
},
}
基本上,我不想接受 forbidden_field
附带的对象。现在我接受更改我的验证器:
validator.allow_unknown = False
这基本上可以设置仅包含 "allowed" 字段的模式,但我真的不喜欢它的作用,因为这禁止我接受其他字段,而不仅仅是 forbidden_field
.
我也看到了allowed
和forbidden
验证规则,但是他们检查的是字段的值,而不是真正存在的字段。
那么,我如何告诉我的验证器只禁止 Cerberus 存在特定字段?
我似乎记得以前遇到过这个特定的用例。您可以尝试以下操作:
from cerberus import Validator
schema = {
'foo': {
'type': 'string',
'validator': lambda field, value, error: error(field, 'field is forbidden!!'),
}
}
v = Validator(schema)
v.allow_unknown = True
doc = {
'foo': 'bar'
}
print(v.validate(doc))
结果应该是 return False
和 v.errors
应该是 "field is forbidden!!"
见:
我使用 readonly
规则解决了这个问题,该规则还允许我设置 default_setter
值。
@kchan 的回答适用于不允许该字段,但它破坏了规范化集成(例如尝试将其与 default_setter
一起使用)。