Python Cerberus
最后修改于 2024 年 1 月 29 日
Python Cerberus 教程展示了如何使用 Python 中的 Cerberus 验证数据。
Cerberus
Cerberus 是一个 Python 验证库,它提供了强大但简单且轻量级的数据验证功能。 它被设计成易于扩展,允许自定义验证。
Cerberus 的工作方式是为数据定义验证模式。 该模式被传递给 Validator
并使用 validate
进行验证。 它有一组规则,例如 required
、min
或 max
,这些规则应用于数据。
多个规则可以应用于数据字段。 如果验证失败,我们可以使用 errors
属性获取错误消息。
Cerberus 类型
以下是 Cerberus 的一个简单演示。 使用 type
规则,我们设置字段的预期数据类型。
#!/usr/bin/python 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 字典。 我们指定 name 字段必须是字符串。
document = {'name': 'john doe'}
这是我们的数据。
if v.validate(document): print('data is valid') else: print('invalid data')
我们使用 validate
验证数据。
$ ./simple.py data is valid
在第二个例子中,我们检查字符串和列表类型。
#!/usr/bin/python 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
规则使该字段成为必填项。
#!/usr/bin/python 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 规则
min
和 max
规则设置整数、浮点数和数字类型允许的最小值和最大值。
对于字符串类型,我们可以使用 minlength
和 maxlength
。
#!/usr/bin/python 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 规则
我们可以使用正则表达式定义更复杂的规则。
#!/usr/bin/python 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': 'john.doe@example.com'}}): print('valid data') else: print('invalid data') print(v.errors)
在本例中,我们使用正则表达式为 phone
和 email
字段定义验证规则。
Cerberus 值强制转换
值强制转换允许我们在数据验证之前将可调用对象应用于值。 可调用对象的返回值替换文档中的新值。 强制转换可用于转换值或在验证之前清理数据。
#!/usr/bin/python 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: - Bratislava - Kosice - Trnava - Moldava - Trencin
该文件包含一个城市列表。
#!/usr/bin/python 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
类扩展来创建自定义验证器。
#!/usr/bin/python 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
对象定义一个自定义验证器。
在本文中,我们展示了如何使用 Cerberus 在 Python 中验证数据。
来源
作者
列出所有 Python 教程。