ZetCode

Python Cerberus

最后修改于 2024 年 1 月 29 日

Python Cerberus 教程展示了如何使用 Python 中的 Cerberus 验证数据。

Cerberus

Cerberus 是一个 Python 验证库,它提供了强大但简单且轻量级的数据验证功能。 它被设计成易于扩展,允许自定义验证。

Cerberus 的工作方式是为数据定义验证模式。 该模式被传递给 Validator 并使用 validate 进行验证。 它有一组规则,例如 requiredminmax,这些规则应用于数据。

多个规则可以应用于数据字段。 如果验证失败,我们可以使用 errors 属性获取错误消息。

Cerberus 类型

以下是 Cerberus 的一个简单演示。 使用 type 规则,我们设置字段的预期数据类型。

simple.py
#!/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

在第二个例子中,我们检查字符串和列表类型。

types.py
#!/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 规则使该字段成为必填项。

required.py
#!/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)

该示例有两个数据字段:nameagename 是一个必填字段。

$ ./required.py
invalid data
{'name': ['required field']}

我们省略了 name 字段;因此,验证失败。

Cerberus min 和 max 规则

minmax 规则设置整数、浮点数和数字类型允许的最小值和最大值。

对于字符串类型,我们可以使用 minlengthmaxlength

min_max.py
#!/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 规则

我们可以使用正则表达式定义更复杂的规则。

regex.py
#!/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)

在本例中,我们使用正则表达式为 phoneemail 字段定义验证规则。

Cerberus 值强制转换

值强制转换允许我们在数据验证之前将可调用对象应用于值。 可调用对象的返回值替换文档中的新值。 强制转换可用于转换值或在验证之前清理数据。

coercing.py
#!/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.yaml
cities:
  - Bratislava
  - Kosice
  - Trnava
  - Moldava
  - Trencin

该文件包含一个城市列表。

from_yaml.py
#!/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 类扩展来创建自定义验证器。

custom_validator.py
#!/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 中验证数据。

来源

Cerberus 文档

作者

我叫 Jan Bodnar,是一位充满激情的程序员,拥有丰富的编程经验。 自 2007 年以来,我一直在撰写编程文章。 迄今为止,我已撰写了 1,400 多篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有 Python 教程