# Python Cerberus 教程

> 原文： [http://zetcode.com/python/cerberus/](http://zetcode.com/python/cerberus/)

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

## Cerberus

Cerberus 是一个 Python 验证库，它提供了功能强大而又简单轻巧的数据验证功能。 它被设计为易于扩展，允许自定义验证。

Cerberus 通过定义数据验证模式来工作。 该模式将传递到`Validator`并使用`validate()`进行验证。 它具有适用于数据的一组规则，例如`required`，`min`或`max`。

可以将多个规则应用于数据字段。 如果验证失败，我们可以获得带有`errors`属性的错误消息。

## Cerberus 类型

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

`simple.py`

```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`字段； 我们希望它是一个字符串值。

```py
from cerberus import Validator

```

我们导入`Validator`类。

```py
schema = {'name': {'type': 'string'}}

```

我们定义模式。 这是 Python 字典。 我们指定名称字段必须为字符串。

```py
document = {'name': 'john doe'}

```

这是我们的数据。

```py
if v.validate(document):
    print('data is valid')
else:
    print('invalid data')

```

我们使用`validate()`验证数据。

```py
$ ./simple.py
data is valid

```

这是输出。

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

`types.py`

```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`

```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`是必填字段。

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

```

我们省略了`name`字段； 因此，验证失败。

## Cerberus 最小和最大规则

`min`和`max`规则设置整数，浮点数和数字类型所允许的最小值和最大值。

对于字符串类型，我们可以使用`minlength`和`maxlength`。

`min_max.py`

```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)

```

在示例中，我们为字符串设置了最小长度，为整数设置了最小和最大大小。

```py
$ ./min_max.py
invalid data
{'age': ['min value is 18'], 'name': ['min length is 2']}

```

我们有两个验证错误。

## Cerberus 正则表达式规则

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

`regex.py`

```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': 'john.doe@example.com'}}):
    print('valid data')
else:
    print('invalid data')
    print(v.errors)

```

在示例中，我们使用正则表达式为`phone`和`email`字段定义验证规则。

## Cerberus 值强制转换

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

`coercing.py`

```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()`函数将数据时间值转换为选定的格式。

```py
$ ./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`

```py
cities:
  - Bratislava
  - Kosice
  - Trnava
  - Moldava
  - Trencin

```

该文件包含城市列表。

`from_yaml.py`

```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`规则设置针对列表的所有元素验证定义的规则。

```py
v = Validator()
v.schema = {'cities': {'type': 'list', 'schema': {'type': 'string'}}}

```

`cities`字段必须是一个列表，并且其所有元素都必须是字符串。

## Cerberus 定制验证器

我们可以通过从`Validator`类扩展来创建自定义验证器。

`custom_validator.py`

```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`对象定义了一个自定义验证器。

在本教程中，我们展示了如何使用 Cerberus 在 Python 中验证数据。

您可能也对以下相关教程感兴趣： [Python 字符串](/lang/python/strings/)， [Python Jinja 教程](/python/jinja/)和 [Python 教程](/lang/python/)，或列出[所有 Python 教程](/all/#python) 。