python - 在 Cerberus 中,您可以使用类型为 'valueschema' 的 'dict' 吗?

标签 python cerberus

所以我使用 Cerberus 进行模式验证,但我遇到了一个特殊情况,即验证 key 未知的字典的子字典。

假设我有以下文件:

dict = {
   'things': {
       '0463': {
           'foo': 'blah',
           'bar': 'bleep'
        },
        '0464': {
           'foo': 'x',
           'bar': 'y'
        },
        'another_random_id': {
           'foo': 'blah',
           'bar': 'bleep'
        }
}

所以我想验证子词典是否具有特定结构(foobar 作为键),但我想不出一种方法来验证它提前知道 key (在我的例子中是随机 ID。我认为这是对 valueschema 的一个很好的使用,但我似乎无法让 valueschema 与“dict”类型的东西一起工作。我试图设置以下模式在 hell 犬中:

schema = {
    'things': {
        'type': 'dict',
        'valueschema': {
             'type': 'dict',
             'foo': {'type': 'string'},
             'bar': {'type': 'string'}
         }
     }
}

我是否错误地定义了我的模式,或者这对于 valueschema 的当前实现是不可能的。我在存储库中看到一些使用 valueschema 的测试,但它们只测试 valueschema 的类型是 int 还是 string。

最佳答案

所以我发现 cerberus 将处理 valueschema 如果它是类型 dict 如果我在 valueschema 之后放置一个 schema 字段 键。所以我的结构应该是:

schema = {
    'things': {
        'type': 'dict',
        'valueschema': {
             'type': 'dict',
             'schema':{
                 'foo': {'type': 'string'},
                 'bar': {'type': 'string'}
             }
         }
     }
}

现在仍然有些奇怪,因为 valueschema 的设计似乎并没有预期它会验证 dict 类型的值。例如,当我从验证器扩展时,我必须覆盖 validate_valueschema 方法,以便 required 验证的行为与常规模式相同,因为当它调用validate 未传入 update 参数的模式。所以我重写的 validate_valueschema 看起来像这样:

def _validate_valueschema(self, schema, field, value):
    if isinstance(value, Mapping):
        for key, document in value.items():
            validator = self._Validator__get_child_validator()
            validator.validate(
                {key: document}, {key: schema}, 
                context=self.document, update=self.update)
            if len(validator.errors):
                self._error(field, validator.errors)

update=self.update 是我添加的所有内容。

关于python - 在 Cerberus 中,您可以使用类型为 'valueschema' 的 'dict' 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37687293/

相关文章:

javascript - 我怎样才能在python vue js中的views.py中处理GET和POST请求?

python - Cerberus 模式验证依赖取决于自身值(value)

python - 如何使用 Cerberus 返回自定义规则名称/错误代码?

python - Cerberus 的严格模式验证

python - 如何自定义 Cerberus 的错误信息?

python - 如何在 python 中嗅探 HTTP 数据包?

python - 使用 MLFlow 执行 GridSearchCV

python - 尽管已安装,但无法在 python 上导入 MySQLdb

Python、Django : Limit IntegerField inside models. py

Python:使用 cerberus 进行验证