是否可以使用Cerberus验证yaml文件的键名和字典名?

时间:2019-06-10 20:48:36

标签: python yaml cerberus

我需要使用Python3.7验证YAML文件。我正在尝试Cerberus执行内容验证。至于值验证,这很好,但是对于键名,我找不到在YAML文件的上下文中成功验证其有效性的方法。

词典名称是一个电子邮件地址,并且对于YAML文件中的每个条目都应该是唯一的,并且应该经过验证。几个关键字名称区分大小写,需要经过验证才能正确。

我也是Python的新手,所以很有可能这只是newb的无知。我可能需要查看Cerberus以外的其他地方,但是除此之外,我没有找到一个可靠的YAML验证器。建议非常欢迎。

我按照Cerberus文档创建了schema.py和validationScript.py。我曾尝试放置键盘规则,但似乎无法在该级别进行“ anyof”验证。在我的测试中,按键规则似乎适用于字典中的所有按键。如果我使用密钥规则,则可以验证一个密钥,但其他密钥则失败。我尝试了一系列规则,尝试了anyof和anyof_regex,但无法让它们成功查看所有键名并进行验证。

我找不到验证字典名称的方法。我知道如果我对YAML中存在的有效电子邮件进行硬编码,就可以验证它。

#! python
from cerberus import Validator
import yaml

def __val_users():
    with open("yamlfile.yaml", 'r') as stream:
        try:
            return yaml.safe_load(stream)
        except yaml.YAMLError as exception:
            print(exception)

schema = eval(open('C:/path/to/schema.py', 'r').read())
v = Validator(schema)
document = __val_users()
print(v.validate(document, schema))
print(v.errors)

schema.py如下所示:

{
    'guest@hotpop.com': {
        'type': 'dict',
    },
        'varOn': {
            'required': True,
            'type': 'string',
                        'regex': '/^\S*$/;'
                },
        'varOff': {
            'required': True,
            'type': 'string',
                        'regex': '/^\S*$/;'
        },
        'access': {
            'required': True,
            'type': 'list',
                        'allowed': ['h1', 'h2', 'h3', 'oper1', 'oper2', 'oper3', 'drive1', 'drive2', 'drive3']
        },
        'hub': {
            'required': True,
            'type': 'list'
        }
}

yaml是

me@mydomain.com:
  varOn: Single
  varOff: Word
  access:
    - h1
    - drive2
    - oper3
  hub:
    - onehub

我希望有可以验证规则的代码,但是使用anyof时我会遇到语法错误:   文件“”,第5行     '任何':            ^ SyntaxError:语法无效

使用键盘规则时,我最终会遇到架构错误

File "C:\Python37\lib\site-packages\cerberus\schema.py", line 275, in _validate
    raise SchemaError(self.schema_validator.errors)
cerberus.schema.SchemaError: `{'me@mydomain.com': [{'keysrules': ["must be of ['dict', 'string'] type"]}]}`

在所有内容验证正常工作的情况下,我最终得到的字典名称(电子邮件地址)以False开头,{'my@mydomain.com': ['unknown field'], 'stack@exchange.com': ['unknown field']}

1 个答案:

答案 0 :(得分:0)

您不能在架构部分中包含一个值,让我们尝试避免在yaml的根中使用电子邮件地址,'key'...看看内部部分并对其进行验证。

await

schema_a.py在同一文件夹中

import yaml
from cerberus import Validator
from schema_a import schema



def __val_users():
    with open("/home/sirsk/Active/document.yml", 'r') as stream:
    #with open("yamlfile.yaml", 'r') as stream:
        try:
            return yaml.safe_load(stream)
        except yaml.YAMLError as exception:
            print(exception)




v = Validator()

document = __val_users()

#you dont know about the email value in this case is the root, key of a dictionary
document = document[next(iter(document))]

if not v.validate(document, schema):
    print(v.errors)