RuntimeError: There's no handler for [insert_filed_name] in the 'validate' domain
RuntimeError: There's no handler for [insert_filed_name] in the 'validate' domain
我正在使用 cerberus
v1.3.2 和 python-3.8
稳定版来验证将用于发送 http 请求的 json 数据。我在使用 dependencies
规则时遇到问题。我的对象有一个字段 request_type
和一个包含更多数据的可选字段 payload
。只有在 ['CREATE', 'AMEND']
中具有 request_type
的对象才具有 payload
。当我 运行 验证时,我收到与 payload
中的字段之一相关的错误。这是我 运行ning:
的代码
from cerberus import Validator
request = {
"request_type": "CREATE",
"other_field_1": "whatever",
"other_field_2": "whatever",
"payload": {
"id": "123456",
"jobs": [
{
"duration": 1800,
"other_field_1": "whatever",
"other_field_2": "whatever"
}
]
}
}
schema = {
'request_type': {
'type': 'string',
'allowed': ['CREATE', 'CANCEL', 'AMEND'],
'required': True,
'empty': False
},
'other_field_1': {'type': 'string', },
'other_field_2': {'type': 'string', },
'payload': {
'required': False,
'schema': {
'id': {
'type': 'string',
'regex': r'[A-Za-z0-9_-]`',
'minlength': 1, 'maxlength': 32,
'coerce': str
},
'jobs': {
'type': 'list',
'schema': {
'duration': {
'type': 'integer', 'min': 0,
'required': True, 'empty': False,
},
'other_field_1': {'type': 'string', },
'other_field_2': {'type': 'string', },
}
}
},
'dependencies': {'request_type': ['CREATE', 'AMEND']},
}
}
validator = Validator(schema, purge_unknown=True)
if validator.validate(request):
print('The request is valid.')
else:
print(f'The request failed validation: {validator.errors}')
这是我遇到的错误:
"RuntimeError: There's no handler for 'duration' in the 'validate' domain."
我做错了什么吗?
对于上下文,我设法通过使用完全相同的规则来进行验证,但我没有使用 dependencies
,而是有两个单独的模式,名为 payload_schema
和 no_payload_schema
。在 payload_schema
中,我将 request_type
的允许值设置为 ['CREATE', 'AMEND']
,在 no_payload_schema
中,我将允许值设置为 ['CANCEL']
。我 运行 对两个模式进行验证,如果它们均未通过,我将引发错误。这听起来有点老套,我想了解如何使用 dependencies
规则来做到这一点。
注意 difference between schema 用于映射和序列。 jobs
字段的值不会被检查为映射,因为您要求它是 list
类型。您将需要这种模式:
{"jobs":
{
{"type": "list", "schema":
{
"type": "dict", "schema": {"duration": ...}
}
}
}
}
schema
规则的这种模糊性将在 Cerberus 的下一个主要版本中解决。为了可读性,可以使用 schema- and rule set-registries 和复杂的验证模式。
通常建议使用最少的示例寻求支持。
我正在使用 cerberus
v1.3.2 和 python-3.8
稳定版来验证将用于发送 http 请求的 json 数据。我在使用 dependencies
规则时遇到问题。我的对象有一个字段 request_type
和一个包含更多数据的可选字段 payload
。只有在 ['CREATE', 'AMEND']
中具有 request_type
的对象才具有 payload
。当我 运行 验证时,我收到与 payload
中的字段之一相关的错误。这是我 运行ning:
from cerberus import Validator
request = {
"request_type": "CREATE",
"other_field_1": "whatever",
"other_field_2": "whatever",
"payload": {
"id": "123456",
"jobs": [
{
"duration": 1800,
"other_field_1": "whatever",
"other_field_2": "whatever"
}
]
}
}
schema = {
'request_type': {
'type': 'string',
'allowed': ['CREATE', 'CANCEL', 'AMEND'],
'required': True,
'empty': False
},
'other_field_1': {'type': 'string', },
'other_field_2': {'type': 'string', },
'payload': {
'required': False,
'schema': {
'id': {
'type': 'string',
'regex': r'[A-Za-z0-9_-]`',
'minlength': 1, 'maxlength': 32,
'coerce': str
},
'jobs': {
'type': 'list',
'schema': {
'duration': {
'type': 'integer', 'min': 0,
'required': True, 'empty': False,
},
'other_field_1': {'type': 'string', },
'other_field_2': {'type': 'string', },
}
}
},
'dependencies': {'request_type': ['CREATE', 'AMEND']},
}
}
validator = Validator(schema, purge_unknown=True)
if validator.validate(request):
print('The request is valid.')
else:
print(f'The request failed validation: {validator.errors}')
这是我遇到的错误:
"RuntimeError: There's no handler for 'duration' in the 'validate' domain."
我做错了什么吗?
对于上下文,我设法通过使用完全相同的规则来进行验证,但我没有使用 dependencies
,而是有两个单独的模式,名为 payload_schema
和 no_payload_schema
。在 payload_schema
中,我将 request_type
的允许值设置为 ['CREATE', 'AMEND']
,在 no_payload_schema
中,我将允许值设置为 ['CANCEL']
。我 运行 对两个模式进行验证,如果它们均未通过,我将引发错误。这听起来有点老套,我想了解如何使用 dependencies
规则来做到这一点。
注意 difference between schema 用于映射和序列。 jobs
字段的值不会被检查为映射,因为您要求它是 list
类型。您将需要这种模式:
{"jobs":
{
{"type": "list", "schema":
{
"type": "dict", "schema": {"duration": ...}
}
}
}
}
schema
规则的这种模糊性将在 Cerberus 的下一个主要版本中解决。为了可读性,可以使用 schema- and rule set-registries 和复杂的验证模式。
通常建议使用最少的示例寻求支持。