Я использую cerberus
v1.3.2 с python-3.8
stable для проверки json данных, которые будут использоваться для отправки http-запросов. У меня проблема с использованием правила dependencies
. Мои объекты имеют поле request_type
и необязательное поле payload
, которое содержит больше данных. Только объекты, которые имеют request_type
в ['CREATE', 'AMEND']
, имеют payload
. Когда я запускаю проверку, я получаю ошибку, связанную с одним из полей в payload
. Вот код, который я запускаю:
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
, чтобы сделать это.