Validation Cerberus中自定义类型的验证

Validation Cerberus中自定义类型的验证,validation,cerberus,Validation,Cerberus,我真的很喜欢Cerberus,但我在文档中找不出一个简单的例子。我想输入fudge,它是一个带有~前缀的字符串。我就是不知道怎么做 fudge_type = cerberus.TypeDefinition('fudge_type', (str,), ()) class MyValidator(cerberus.Validator): types_mapping = cerberus.Validator.types_mapping.copy() types_mapping['fu

我真的很喜欢Cerberus,但我在文档中找不出一个简单的例子。我想输入
fudge
,它是一个带有
~
前缀的字符串。我就是不知道怎么做

fudge_type = cerberus.TypeDefinition('fudge_type', (str,), ())

class MyValidator(cerberus.Validator):
    types_mapping = cerberus.Validator.types_mapping.copy()
    types_mapping['fudge'] = fudge_type

    def __init__(self, *args, **kwargs):
        if 'additional_context' in kwargs:
            self.additional_context = kwargs['additional_context']
        super(MyValidator, self).__init__(*args, **kwargs)

    @property
    def additional_context(self):
        self._error(field, "INVALID!")
        return self._config.get('additional_context', 'bar')

    def _validate_type_fudge(self, field, value):
        self._error(field, "INVALID!")
        make_use_of(self.additional_context)

validator = MyValidator()
validator.validate({'name': 'yada'}, {'name': {'type': 'fudge'}})  # => True

这似乎是个简单的例子。。所以我觉得我做了一些完全错误的事情。

在Cerberus 1.2中,您可以实现以下目标:

import cerberus

SCHEMA = {
    'fudge': {
        'type': 'mytype'
    }
}

class MyValidator(cerberus.Validator):
    def _validate_type_mytype(self, value):
        if value.startswith('~'):
            return True

validator = MyValidator()
validator.validate({'fudge': 'yada'}, SCHEMA)

因此无需使用
类型定义

进行修改,因此在1.2中,您必须在调用validate时通过SCEMA?因为我正在尝试为
tuple
值创建自定义类型。但是它在访问
\u validate\u type\u tuple
方法时会出现运行时错误,该方法不存在(即使我将其添加到自定义类中)。