0

我需要验证从用户收到的字典

问题是一个字段既可以是字典也可以是字典列表。我如何用 cerberus 验证这一点?

像一个例子我尝试这个模式:

v = Validator(
    {
        'v': {
            'type': ['dict', 'list'], 
            'schema': {
                'type': 'dict', 
                'schema': {'name': {'type': 'string'}}
           }
       }
    }
)

但是当我在测试数据上尝试时,我收到错误:

v.validate({'v': {'name': '2'}})  # False
# v.errors: {'v': ['must be of dict type']}

错误:

{'v': ['must be of dict type']}
4

2 回答 2

1

我猜内部schema是用于为字典键的值定义类型和规则(如果v是字典):

v = Validator(
    {
        'v': {
            'type': ['dict', 'list'],
            'schema': {
                'name': {'type': 'string'}
           }
       }
    }
)

print(v.validate({'v': {'name': '2'}}))
print(v.errors)

或对于列表值,如果v是列表:

v = Validator(
    {
        'v': {
            'type': ['dict', 'list'],
            'schema': {
                'type': 'integer',
           }
       }
    }
)

print(v.validate({'v': [1]}))
print(v.errors)

两种情况的正输出:

True
{}
于 2019-07-22T14:12:05.037 回答
1

我尝试了以下方法,它似乎工作正常:

'oneof':[
     {
         'type': 'dict',
         'schema':{
             'field1': {
                 'type':'string',
                 'required':True
             },
             'field2': {
                 'type':'string',
                 'required':False
             }
         }
     },
     {
         'type': 'list',
         'schema': {
             'type': 'dict',
             'schema':{
                 'field1': {
                     'type':'string',
                     'required':True
                 },
                 'field2': {
                     'type':'string',
                     'required':False
                 }
             }
         }
     }
]

对于遇到此问题的其他人,我希望这可能有用。我花了一些时间来完全理解事情。

于 2021-07-23T05:48:48.803 回答