Cerberus接受空值的有效

时间:2017-09-08 08:53:55

标签: python flask cerberus

尝试将此验证作为可接受的True,其中任何字段可以是empty: True(默认情况下我知道),但是当不为空时,必须应用所有顺序条件。

SCHEMA v = Validator()

schm = {'l_addrsch': {'type': 'string', 'empty': True, 'allowed': ['m', 'o', 'e', 'M', 'O', 'E'], 'dependencies': ['l_nrefaddr', 'l_refaddr']},
    'l_nrefaddr': {'type': 'integer', 'empty': True, 'dependencies': ['l_addrsch', 'l_refaddr']},
    'l_refaddr': {'type': 'integer', 'empty': True, 'dependencies': ['l_addrsch', 'l_nrefaddr']}}

POST val = v.validate(p, schema)

{ 
"l_addrsch" : "",
"l_nrefaddr" : "",
"l_refaddr" :  ""
}

回应

    [
    {
        "l_addrsch": [
            "unallowed value "
        ],
        "l_nrefaddr": [
            "must be of integer type"
        ],
        "l_refaddr": [
            "must be of integer type"
        ]
    }
]

希望我不会太混淆。

编辑1:  在规范化规则'default'时提到了这个:

schema = {'l_addrsch': {'type': 'string', 'default': '', 'allowed': ['', 'm', 'o', 'e', 'M', 'O', 'E'], 'dependencies': ['l_nrefaddr', 'l_refaddr']},
                'l_nrefaddr': {'type': 'integer', 'default': 0, 'dependencies': ['l_addrsch', 'l_refaddr']},
                'l_refaddr': {'type': 'integer', 'default': 0, 'dependencies': ['l_addrsch', 'l_nrefaddr']}

POST:

   { "l_addrsch" : "",
    "l_nrefaddr" : "",
    "l_refaddr" :  ""}

但似乎我仍然缺少一些让它适用于整数的东西

[
    {
        "l_nrefaddr": [
            "must be of integer type"
        ],
        "l_refaddr": [
            "must be of integer type"
        ]
    }
]

2 个答案:

答案 0 :(得分:0)

来自doc

  

如果False,则可迭代值的验证如果为空则将失败。   手动将其设置为True是没有意义的,因为它的行为类似于省略   所有的规则

要设置默认值,请改用规范化规则。 http://docs.python-cerberus.org/en/stable/normalization-rules.html#default-values

这样的事情:

'kind': {'type': 'string', 'default': ''}

答案 1 :(得分:0)

验证失败有两个原因:

  1. ''未定义为allowed值,此规则集应达到l_addrsch字段所需的值:

    'l_addrsch': {'type': string, 'allowed': ('', 'm', 'o', 'e', 'M', 'O', 'E'), 'required': True}

    更新:使用Cerberus 1.2,可能会有一个空字段(如果允许),不会检查是否允许值(请参阅this commit)。

  2. 当一个字符串('')作为其他两个字段的值传递时,它会因type约束到integer而失败。如果''始终表示0,则应添加coercion输入值。