Python Cerberus 教程
Python Cerberus 教程 展示了如何在 Python 中使用 Cerberus 验证数据。
Cerberus
Cerberus 是一个 Python 验证库,它提供了功能强大而又简单轻巧的数据验证功能。 它被设计为易于扩展,允许自定义验证。
Cerberus 通过定义数据验证模式来工作。 该模式将传递到Validator
并使用validate()
进行验证。 它具有适用于数据的一组规则,例如required
,min
或max
。
可以将多个规则应用于数据字段。 如果验证失败,我们可以获得带有errors
属性的错误消息。
Cerberus 类型
以下是 Cerberus 的简单演示,使用type
规则,我们可以设置字段的预期数据类型。
simple.py
| #!/usr/bin/env python3
from cerberus import Validator
schema = {'name': {'type': 'string'}}
v = Validator(schema)
document = {'name': 'john doe'}
if v.validate(document):
print('data is valid')
else:
print('invalid data')
|
在示例中,我们验证name
字段; 我们希望它是一个字符串值。
| from cerberus import Validator
|
我们导入Validator
类。
| schema = {'name': {'type': 'string'}}
|
我们定义模式。 这是 Python 字典。 我们指定名称字段必须为字符串。
| document = {'name': 'john doe'}
|
这是我们的数据。
| if v.validate(document):
print('data is valid')
else:
print('invalid data')
|
我们使用validate()
验证数据。
| $ ./simple.py
data is valid
|
在第二个示例中,我们检查字符串和列表类型。
types.py
| #!/usr/bin/env python3
from cerberus import Validator
v = Validator()
v.schema = {'words': {'type': ['string', 'list']}}
if v.validate({'words': 'falcon'}):
print('valid data')
else:
print('invalid data')
if v.validate({'words': ['falcon', 'sky', 'cloud']}):
print('valid data')
else:
print('invalid data')
|
该示例验证words
字段是字符串还是列表。
Cerberus 法则
required
规则使该字段为必填字段。
required.py
| #!/usr/bin/env python3
from cerberus import Validator
v = Validator()
v.schema = {'name': {'required': True, 'type': 'string'},
'age': {'type': 'integer'}}
if v.validate({'age': 34}):
print('valid data')
else:
print('invalid data')
print(v.errors)
|
该示例有两个数据字段:name
和age
。 name
是必填字段。
| $ ./required.py
invalid data
{'name': ['required field']}
|
我们省略了name
字段; 因此,验证失败。
Cerberus 最小和最大规则
min
和max
规则设置整数,浮点数和数字类型所允许的最小值和最大值。
对于字符串类型,我们可以使用minlength
和maxlength
。
min_max.py
| #!/usr/bin/env python3
from cerberus import Validator
v = Validator()
v.schema = {'name': { 'type': 'string', 'minlength': 2},
'age': {'type': 'integer', 'min': 18, 'max': 65}}
if v.validate({'name': 'J', 'age': 4}):
print('valid data')
else:
print('invalid data')
print(v.errors)
|
在示例中,我们为字符串设置了最小长度,为整数设置了最小和最大大小。
| $ ./min_max.py
invalid data
{'age': ['min value is 18'], 'name': ['min length is 2']}
|
我们有两个验证错误。
Cerberus 正则表达式规则
我们可以使用正则表达式定义更复杂的规则。
regex.py
| #!/usr/bin/env python3
from cerberus import Validator
v = Validator()
v.schema = {"contact_details": {
"type": "dict",
"schema": {
"phone": {
"type": "string",
"minlength": 10,
"maxlength": 10,
"regex": "^0[0-9]{9}$"
},
"email": {
"type": "string",
"minlength": 8,
"maxlength": 255,
"required": True,
"regex": "^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\\.[a-zA-Z0-9-.]+$"
}
}
}}
if v.validate({'contact_details': {'phone': '0901123123',
'email': '[email protected]'}}):
print('valid data')
else:
print('invalid data')
print(v.errors)
|
在示例中,我们使用正则表达式为phone
和email
字段定义验证规则。
Cerberus 值强制转换
值强制使我们可以在数据验证之前将可调用对象应用于值。 可调用对象的返回值替换文档中的新值。 在验证之前,可以使用强制转换数据或清除数据。
coercing.py
| #!/usr/bin/env python3
from cerberus import Validator
from datetime import datetime
def to_date(s):
return datetime.strptime(s, '%Y-%m-%d')
v = Validator()
v.schema = {'start_date': {'type': 'datetime', 'coerce': to_date}}
if v.validate({'start_date': '2019-12-11'}):
print('valid data')
else:
print('invalid data')
print(v.errors)
if v.validate({'start_date': '2019/12/11'}):
print('valid data')
else:
print('invalid data')
print(v.errors)
|
在示例中,我们使用自定义to_date()
函数将数据时间值转换为选定的格式。
| $ ./coercing.py
valid data
invalid data
{'start_date': ["field 'start_date' cannot be coerced: time data '2019/12/11' does not
match format '%Y-%m-%d'", 'must be of datetime type']}
|
使用 YAML 文件
在下一个示例中,我们将数据存储在 YAML 文件中。
cities.yaml
| cities:
- Bratislava
- Kosice
- Trnava
- Moldava
- Trencin
|
该文件包含城市列表。
from_yaml.py
| #!/usr/bin/env python3
from cerberus import Validator
import yaml
v = Validator()
v.schema = {'cities': {'type': 'list', 'schema': {'type': 'string'}}}
with open('cities.yaml') as f:
data = yaml.load(f, Loader=yaml.FullLoader)
print(data)
if v.validate({'cities': data['cities']}):
print('valid data')
else:
print('invalid data')
print(v.errors)
|
我们从 YAML 文件中读取数据并进行验证。 schema
规则设置针对列表的所有元素验证定义的规则。
| v = Validator()
v.schema = {'cities': {'type': 'list', 'schema': {'type': 'string'}}}
|
cities
字段必须是一个列表,并且其所有元素都必须是字符串。
Cerberus 定制验证器
我们可以通过从Validator
类扩展来创建自定义验证器。
custom_validator.py
| #!/usr/bin/env python3
from cerberus import Validator
from dataclasses import dataclass
@dataclass
class Person:
name: str
age: int
class PersonValidator(Validator):
def validate_person(self, obj):
return self.validate(obj.__dict__)
schema = {'name': { 'type': 'string', 'minlength': 2},
'age': {'type': 'integer', 'min': 18, 'max': 65}}
v = PersonValidator(schema)
p = Person('John Doe', 2)
if v.validate_person(p):
print('valid data')
else:
print('invalid data')
print(v.errors)
|
在示例中,我们为Person
对象定义了一个自定义验证器。