validictory 无法正确验证

validictory is not able to validate properly

我正在尝试验证烧瓶请求的 headers 及其失败。我正在尝试使用下面的代码来模拟相同的代码,并且可以看到它无法正确验证 headers 即使我错过了一些强制性的 headers.

下面的代码预计会失败,但它通过了。

import validictory
from werkzeug.datastructures import EnvironHeaders
obj = EnvironHeaders(environ={})
validictory.validate(obj,{'type': 'object', 'properties': {'test':{'required': True, 'type': 'any'}}})

如果我将 EnvironHeaders 转换为字典,则验证会正常进行。

import validictory
from werkzeug.datastructures import EnvironHeaders
obj = EnvironHeaders(environ={})
validictory.validate(dict(obj),{'type': 'object', 'properties': {'test':{'required': True, 'type': 'any'}}})

这会在验证期间正确引发以下错误。关于第一种情况发生不正确验证的原因有什么想法吗?

validictory.validator.RequiredFieldValidationError: Required field 'test' is missing

我通过查看 validictory 的源代码找到了这个问题的原因。

它正在通过类型验证,因为 EnvironHeaders 具有属性 'keys' 和 'values'。

    def validate_type_object(self, val):
        return isinstance(val, Mapping) or (hasattr(val, 'keys') and hasattr(val, 'items'))

属性 验证仅针对 dict 类型发生,并且验证通过,因为如果输入类型不是字典,代码不会引发任何错误。

    def validate_properties(self, x, fieldname, schema, path, properties=None):
        ''' Validates properties of a JSON object by processing the object's schema recursively '''
        value = x.get(fieldname)
        if value is not None:
            if isinstance(value, dict):
                if isinstance(properties, dict):

                    if self.disallow_unknown_properties or self.remove_unknown_properties:
                        self._validate_unknown_properties(properties, value, fieldname,
                                                      schema.get('patternProperties'))

                    for property in properties:
                        self.__validate(property, value, properties.get(property),
                                    path + '.' + property)
                else:
                    raise SchemaError("Properties definition of field '{0}' is not an object"
                                  .format(fieldname))

注意: Validictory 已停止支持,因此不会在 git 回购中提出任何问题。将按照建议尝试使用 jsonschema 包。