0

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

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

我也是 Python 的新手,所以很有可能这只是新手的无知。我可能需要寻找 Cerberus 以外的其他地方,但我还没有找到一个强大的 YAML 验证器。非常欢迎提出建议。

我按照 Cerberus 文档创建了 schema.py 和 validationScript.py。我试图放置密钥规则,但似乎无法在该级别进行“任何”验证。在我的测试中,键规则似乎适用于字典中的所有键。如果我使用密钥规则,我可以验证一个密钥,但其他密钥失败。我尝试了一系列规则,我尝试了 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 时会出现语法错误:File "", line 5 'anyof': ^ SyntaxError: invalid syntax

使用键规则时,我最终会出现架构错误

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']}

4

1 回答 1

0

您不能在架构部分中包含值,让我们尽量避免使用电子邮件地址,yaml 根目录中的“键”......查看内部部分并验证他。

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)

schema_a.py 在同一文件夹中

schema = {
    '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'
    }
}
于 2019-11-28T18:40:32.367 回答