代码之家  ›  专栏  ›  技术社区  ›  Eir Nym

如何验证cerberus模式

  •  0
  • Eir Nym  · 技术社区  · 7 年前

    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 回复  |  直到 7 年前
        1
  •  0
  •   Flargebla    7 年前

    我希望这能回答你的问题,因为我不太确定我是否理解正确。这确实感觉有点像一个解决办法,但它会做你想要的。听起来你想在多个地方重用一组需求。我看到的最佳选择是创建一个自定义验证器子类,并添加一个自定义验证器方法来处理共享规则集。根据您提供的示例,下面的代码应该可以工作。

    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 required_string 变量,该变量包含要使用的实际规则的字典,然后在较大的架构定义中引用该变量。这将允许您使用实际的规则,而不必定义函数来实现规则。

    推荐文章