python cerberus - 如何捕捉 UNALLOWED_VALUE?

python cerberus - how to catch UNALLOWED_VALUE?

如何捕获 UNALLOWED_VALUE 错误?

# my schema
schema = {
    'sort': {
        'type': 'list',
        'empty': False,
        'required': True,
        'schema': {
            'type': 'dict',
            'schema': {
                'property': {
                    'type': 'string',
                    'required': True,
                    'allowed': ['test']
                },
                'direction': {
                    'type': 'string',
                    'required': True,
                    'allowed': ['asc', 'desc']
                }
            }
        }
    }
}

# my raw data
sort = {'sort': [{'property': '', 'direction': 'asc'}, {'property': '', 'direction': 'desc'}]}

# my error
{'sort': [{0: [{'property': ['unallowed value ']}], 1: [{'property': ['unallowed value ']}]}]}

cerberus.errors.UNALLOWED_VALUE 在 v._errors - 不起作用

感谢您的回答

所以我没有一个好的答案,但我有一个解释和一个不太有趣的解决方法。

您可以通过查看 docs 开始了解此处的问题。如果您查看 info 属性,您会发现它提到了批量验证如何将其各自的错误填入此处。您遇到的问题是您预期的 UNALLOWED_VALUE 错误被其他错误掩盖了。要更清楚地看到这一点,您可以查看正在返回的基础错误对象(使用 ._errors 而不是 .errors)。当你这样做时,你会看到:

[ValidationError @ 0x1fe369bcbe0 ( document_path=('sort',),schema_path=('sort', 'schema'),code=0x82,constraint={'type': 'dict', 'schema': {'property': {'type': 'string', 'required': True, 'allowed': ['test']}, 'direction': {'type': 'string', 'required': True, 'allowed': ['asc', 'desc']}}},value=[{'property': '', 'direction': 'asc'}, {'property': '', 'direction': 'desc'}],info=([ValidationError @ 0x1fe369bc4f0 ( document_path=('sort', 0),schema_path=('sort', 'schema', 'schema'),code=0x81,constraint={'property': {'type': 'string', 'required': True, 'allowed': ['test']}, 'direction': {'type': 'string', 'required': True, 'allowed': ['asc', 'desc']}},value={'property': '', 'direction': 'asc'},info=([ValidationError @ 0x1fe369bcb80 ( document_path=('sort', 0, 'property'),schema_path=('sort', 'schema', 'schema', 'property', 'allowed'),code=0x44,constraint=['test'],value="",info=('',) )],) ), ValidationError @ 0x1fe369bcdc0 ( document_path=('sort', 1),schema_path=('sort', 'schema', 'schema'),code=0x81,constraint={'property': {'type': 'string', 'required': True, 'allowed': ['test']}, 'direction': {'type': 'string', 'required': True, 'allowed': ['asc', 'desc']}},value={'property': '', 'direction': 'desc'},info=([ValidationError @ 0x1fe369bcbb0 ( document_path=('sort', 1, 'property'),schema_path=('sort', 'schema', 'schema', 'property', 'allowed'),code=0x44,constraint=['test'],value="",info=('',) )],) )],) )]

它看起来并不漂亮,但如果你分析它,你会发现还有其他错误包裹着你想看的那个。因此,当您使用简单的 UNALLOWED_VALUE in v.errors 检查进行简单测试时,它会失败。如果您一直深入研究,您 可以 在您的特定示例代码中粗略地完成这项工作。您需要像这样的支票:cerberus.errors.UNALLOWED_VALUE in v._errors[0].info[0][0].info[0]。显然,这很恶心,我不推荐它。

我不太确定库中是否有一种机制可以更好地处理这个问题,但作为一种解决方法,您可以简单地检查 info 属性 您发现的错误实例更多ValidationErrorclasses。这并不干净,也许您可​​以使用 Validator class error_handler 参数做更多的事情,但希望这能有所帮助!