Как проверить схему Цербера - PullRequest
0 голосов
/ 01 октября 2018

Мое веб-приложение использует 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

1 Ответ

0 голосов
/ 08 октября 2018

Я надеюсь, что это отвечает на ваш вопрос, так как я не совсем уверен, что я правильно понял.Это немного похоже на обходной путь, но это также будет делать то, что вы хотите.Похоже, вы хотите повторно использовать набор требований в нескольких местах.Лучший вариант, который я вижу для этого, - это создать собственный подкласс 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, которая содержит словарь фактических правил, которые вы хотите использовать, и затем ссылаться на эту переменную в более крупных определениях схемы.Это позволит вам использовать фактические правила вместо того, чтобы определять функцию для реализации правил.

...