RuntimeError: в домене 'validate' нет обработчика для [insert_filed_name] - PullRequest
1 голос
/ 04 марта 2020

Я использую 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, чтобы сделать это.

1 Ответ

0 голосов
/ 12 марта 2020

Обратите внимание на разницу между схемой , используемой для отображений и последовательностей. Значение поля jobs не будет проверяться как отображение, так как требуется, чтобы оно было типа list. Вам понадобится этот шаблон:

{"jobs": 
  {
    {"type": "list", "schema": 
      {
        "type": "dict", "schema": {"duration": ...}
      }
    }
  }
}

Эта двусмысленность правила schema будет устранена в следующем основном выпуске Cerberus. Для удобства чтения можно использовать схемы и наборы правил-реестров со сложными схемами проверки.

Обычно рекомендуется обратиться с минимальными примерами поддержки.

...