如何验证Cerberus模式

时间:2018-10-01 20:07:08

标签: validation cerberus

我的Web应用程序对每个请求使用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 :(得分:0)

我希望这能回答您的问题,因为我不确定我是否正确理解。感觉上确实有点像变通办法,但是它也会做您想要的事情。听起来您想在多个地方重用一组需求。为此,我看到的最佳选择是创建一个自定义的Validator子类,并添加一个自定义的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变量,该变量包含要使用的实际规则的字典,然后在较大的架构定义中引用该变量。这样一来,您可以使用实际规则,而不必定义实现规则的功能。

相关问题