Как проверить схему Цербера

Мое веб-приложение использует проверку схемы Cerberus для каждого запроса (текущая версия — 1.2). Для этого я пишу схему в YAML, загружаю ее при запуске приложения, выполняю проверку и использую множество обратных ссылок для оптимизации своей работы, как показано на схеме ниже.

Очень жаль ловить ошибки схемы в тестах/среде выполнения. Как проверить саму схему при запуске приложения без записи фиктивных значений для каждого из них?

---
_required_string: &required_string
  type: string
  empty: False
  required: True
  nullable: False

# Sign in request body
signin:
  type: dict
  empty: False
  nullable: False
  schema:
    name: *required_string
    password: *required_string

person Eir Nym    schedule 01.10.2018    source источник


Ответы (1)


Я надеюсь, что это отвечает на ваш вопрос, поскольку я не совсем уверен, что правильно его понял. Это немного похоже на обходной путь, но он тоже будет делать то, что вы хотите. Похоже, вы хотите повторно использовать набор требований в нескольких местах. Лучший выбор, который я вижу для этого, — создать собственный подкласс Validator и добавить собственный метод проверки для обработки общих наборов правил. Приведенный ниже код должен работать с учетом приведенного вами примера.

from cerberus import Validator
import yaml

class MyValidator(Validator):
    def _validator_required_string(self, field, value):
        # Check the type
        if type(value) != str:
            self._error(field, "Must be of type 'str'")
        # Check the length
        if len(value) == 0:
            self._error(field, "Cannot be blank")

data = {"signin": { "name": "myusername",
                    "password": "mypassword"}}

schema = '''
signin:
    type: dict
    empty: False
    nullable: False
    schema:
        name:
            validator: required_string
        password:
            validator: required_string
'''

v = MyValidator(yaml.load(schema))

Вы можете ознакомиться с документацией по Custom Validators здесь, чтобы понять требования к именованию. В качестве примечания: если вы можете определить свою схему в коде Python вместо YAML, вы можете определить переменную required_string, которая содержит словарь фактических правил, которые вы хотите использовать, а затем ссылаться на эту переменную в более крупных определениях схемы. Это позволит вам использовать фактические правила вместо того, чтобы определять функцию для реализации правил.

person Flargebla    schedule 08.10.2018
comment
не проблема включить части в мою схему, поскольку YAML достаточно гибок, чтобы дать мне возможность загружать по-разному. Проблема заключается в проверке самой схемы без создания фиктивных значений. - person Eir Nym; 08.10.2018