validator.py是一个数据验证工具,确保数据符合一定的规则。一个validation是一个字典,对于字典中的每一个键,包含一个规则列表。
先看两个简单的例子,就可以大致了解validator的用法啦,也可以从中体会到validator与validators的不同之处。
from validator import Required, Not, Truthy, Blank, Range, Equals, In, validate
# let's say that my dictionary needs to meet the following rules...
rules = {
"foo": [Required, Equals(123)], # foo must be exactly equal to 123
"bar": [Required, Truthy()], # bar must be equivalent to True
"baz": [In(["spam", "eggs", "bacon"])], # baz must be one of these options
"qux": [Not(Range(1, 100))] # qux must not be a number between 1 and 100 inclusive
}
# then this following dict would pass:
passes = {
"foo": 123,
"bar": True, # or a non-empty string, or a non-zero int, etc...
"baz": "spam",
"qux": 101
}
>>> validate(rules, passes)
ValidationResult(valid=True, errors={})
# but this one would fail
fails = {
"foo": 321,
"bar": False, # or 0, or [], or an empty string, etc...
"baz": "barf",
"qux": 99
}
>>> validate(rules, fails)
ValidationResult(valid=False, errors={'baz': ["must be one of ['spam', 'eggs', 'bacon']"], 'foo': ['must be equal to 123'], 'bar': ['must be True-equivalent value'], 'qux': ['must not fall between 1 and 100']})
一、安装
1、稳定版本安装
$ pip install validator.py
2、最新版本
可以从 http://github.com/mansam/validator.py 获得最新版本
二、开启验证之旅
我们可以自定义验证器,先上例子:
dictionary = {
"foo": "bar"
}
validation = {
"foo": [lambda x: x == "bar"]
}
>>> validate(validation, dictionary)
ValidationResult(valid=True, errors={})
# Success!
其中,validation是我们的验证规则(检查点),dictionary是要检查的数据,将validation与dictionary作为函数validate的参数,即可获得验证结果。我们可以根据实际需要定义更为复杂的验证规则。
三、几个可以直接使用的验证器
1、Equals
值匹配验证
passes = {
"foo": "bar"
}
failures = {
"foo": "barrr"
}
validation = {
"foo": [Equals("bar")]
}
>>> validate(validation, passes)
ValidationResult(valid=True, errors={})
# Success!
>>> validate(validation, failures)
ValidationResult(valid=False, errors={'foo': ["must be equal to 'bar'"]})
# Failure!
2、Required
默认情况下,key
是可选择的。如果一个key
在validation
中,但是不在dictionary
中,那么在数据验证时,默认跳过。如果想要确保某个key存在,可以用Required。
dictionary1 = {
"foo": "bar"
}
dictionary2 = {
}
validation = {
"foo": [Required, Equals("bar")]
}
>>> validate(validation, dictionary1)
ValidationResult(valid=True, errors={})
>>> validate(validation, dictionary2)
ValidationResult(valid=False, errors={'foo': 'must be present'})
3、Truthy
验证dictionary中的值是否是python中的真值,python中的真值包括 True, 非0整数,非空列表,非空字符串等。
dictionary = {
"foo": 1
}
validation = {
"foo": [Required, Truthy()]
}
>>> validate(validation, dictionary)
ValidationResult(valid=True, errors={})
4、Range
验证dictionary中的值是否在Range范围内。
dictionary = {
"foo": 10
}
failure = {
"foo": 12
}
validation = {
"foo": [Required, Range(1, 11)]
}
>>> validate(validation, dictionary)
ValidationResult(valid=True, errors={})
>>> validate(validation, failure)
ValidationResult(valid=False, errors={'foo': ['must fall between 1 and 11']})
5、Pattern
验证数据格式。
dictionary = {
"foo": "30%"
}
failure = {
"foo": "99.0"
}
validation = {
"foo": [Required, Pattern("\d\d\%")]
}
>>> validate(validation, dictionary)
ValidationResult(valid=True, errors={})
# Success!
>>> validate(validation, failure)
ValidationResult(valid=False, errors={'foo': ['must match regex pattern \\d\\d\\
%']})
# failure
6、In
检查dictionary
中的值是否在一个集合中
dictionary = {
"foo": "spam"
}
failure = {
"foo": "beans"
}
validation = {
"foo": [Required, In(["spam", "eggs", "bacon"])]
}
>>> validate(validation, dictionary)
ValidationResult(valid=True, errors={})
>>> validate(validation, failure)
ValidationResult(valid=False, errors={'foo': ['must match regex pattern \\d\\d\\
%']})
7、Not
Not
可以放在其他验证器前面,表示相反的验证内容。
dictionary = {
"foo": "beans"
}
validation = {
"foo": [Required, Not(In(["spam", "eggs", "bacon"]))]
}
>>> validate(validation, dictionary)
ValidationResult(valid=True, errors={})
dictionary = {
"foo": 10
}
validation = {
"foo": [Required, Not(Range(1, 11))]
}
>>> validate(validation, dictionary)
ValidationResult(valid=False, errors={'foo': ['must not fall between 1 and 11']})
8、InstanceOf
检查dictionary
中的值是否是一个基类或它的子类的实例。
dictionary = {
"foo": u"i'm_a_unicode_string"
}
failure = {
"foo": object
}
validation = {
"foo": [Required, InstanceOf(basestring)]
}
>>> validate(validation, dictionary)
ValidationResult(valid=True, errors={})
>>> validate(validation, failure)
ValidationResult(valid=False, errors={'foo': ['must be an instance of str or its
subclasses']})
9、SubclassOf
检查dictionary
中的值是否是一个基类的子类,特别强调,这里说的是基类的子类,而不是类的实例。
dictionary = {
"foo": unicode
}
failure = {
"foo": "bar"
}
validation = {
"foo": [Required, SubclassOf(basestring)]
}
>>> validate(validation, dictionary)
ValidationResult(valid=True, errors={})
>>> validate(validation, failure)
ValidationResult(valid=False, errors={'foo': ['must be a subclass of basestring']})
10、Length
检查dictionary
中的value
至少有minimum 个元素,至多有maximum个元素,其中第一个参数为minimum ,第二个参数maximum可选。
dictionary = {
"foo": [1, 2, 3, 4, 5]
}
validation = {
"foo": [Length(0, maximum=5)]
}
>>> validate(validation, dictionary)
ValidationResult(valid=True, errors={})
dictionary = {
"foo": [1, 2, 3, 4, 5]
}
validation = {
"foo": [Length(6, maximum=10)]
}
>>> validate(validation, dictionary)
ValidationResult(valid=False, errors={'foo': ['must be between 6 and 10 elements in length']})
四、条件验证
在某些情况下,我们可能需要先验证某项数据,在这项数据验证通过时再进行下一步的验证,这时,我们可以使用条件验证,If(validator, Then(validation))
pet = {
"name": "whiskers",
"type": "cat"
}
cat_name_rules = {
"name": [In(["whiskers", "fuzzy", "tiger"])]
}
dog_name_rules = {
"name": [In(["spot", "ace", "bandit"])]
}
validation = {
"type": [
If(Equals("cat"), Then(cat_name_rules)),
If(Equals("dog"), Then(dog_name_rules))
]
}
>>> validate(validation, pet)
ValidationResult(valid=True, errors={})
五、嵌套验证
有时我们需要验证的数据不是简单的结构,而是一个嵌套结构。上栗子:
validator = {
"foo": [Required, Equals(1)],
"bar": [Required, {
"baz": [Required, Equals(2)],
"qux": [Required, {
"quux": [Required, Equals(3)]
}]
}
]
}
test_case = {
"foo": 1,
"bar": {
"baz": 2,
"qux": {
"quux": 3
}
}
}
>>> validate(validator, test_case)
ValidationResult(valid=True, errors={})
上一篇: Python数据验证库(一) validators
http://www.jianshu.com/p/2babed54b496
下一篇:Python数据验证库(三)voluptuous
http://www.jianshu.com/p/0a5047a04ffd