原文: http://zetcode.com/python/cerberus/

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

Cerberus

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

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

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

Cerberus 类型

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

simple.py

  1. #!/usr/bin/env python3
  2. from cerberus import Validator
  3. schema = {'name': {'type': 'string'}}
  4. v = Validator(schema)
  5. document = {'name': 'john doe'}
  6. if v.validate(document):
  7. print('data is valid')
  8. else:
  9. print('invalid data')

在示例中,我们验证name字段; 我们希望它是一个字符串值。

  1. from cerberus import Validator

我们导入Validator类。

  1. schema = {'name': {'type': 'string'}}

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

  1. document = {'name': 'john doe'}

这是我们的数据。

  1. if v.validate(document):
  2. print('data is valid')
  3. else:
  4. print('invalid data')

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

  1. $ ./simple.py
  2. data is valid

这是输出。

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

types.py

  1. #!/usr/bin/env python3
  2. from cerberus import Validator
  3. v = Validator()
  4. v.schema = {'words': {'type': ['string', 'list']}}
  5. if v.validate({'words': 'falcon'}):
  6. print('valid data')
  7. else:
  8. print('invalid data')
  9. if v.validate({'words': ['falcon', 'sky', 'cloud']}):
  10. print('valid data')
  11. else:
  12. print('invalid data')

该示例验证words字段是字符串还是列表。

Cerberus 法则

required规则使该字段为必填字段。

required.py

  1. #!/usr/bin/env python3
  2. from cerberus import Validator
  3. v = Validator()
  4. v.schema = {'name': {'required': True, 'type': 'string'},
  5. 'age': {'type': 'integer'}}
  6. if v.validate({'age': 34}):
  7. print('valid data')
  8. else:
  9. print('invalid data')
  10. print(v.errors)

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

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

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

Cerberus 最小和最大规则

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

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

min_max.py

  1. #!/usr/bin/env python3
  2. from cerberus import Validator
  3. v = Validator()
  4. v.schema = {'name': { 'type': 'string', 'minlength': 2},
  5. 'age': {'type': 'integer', 'min': 18, 'max': 65}}
  6. if v.validate({'name': 'J', 'age': 4}):
  7. print('valid data')
  8. else:
  9. print('invalid data')
  10. print(v.errors)

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

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

我们有两个验证错误。

Cerberus 正则表达式规则

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

regex.py

  1. #!/usr/bin/env python3
  2. from cerberus import Validator
  3. v = Validator()
  4. v.schema = {"contact_details": {
  5. "type": "dict",
  6. "schema": {
  7. "phone": {
  8. "type": "string",
  9. "minlength": 10,
  10. "maxlength": 10,
  11. "regex": "^0[0-9]{9}$"
  12. },
  13. "email": {
  14. "type": "string",
  15. "minlength": 8,
  16. "maxlength": 255,
  17. "required": True,
  18. "regex": "^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\\.[a-zA-Z0-9-.]+$"
  19. }
  20. }
  21. }}
  22. if v.validate({'contact_details': {'phone': '0901123123',
  23. 'email': 'john.doe@example.com'}}):
  24. print('valid data')
  25. else:
  26. print('invalid data')
  27. print(v.errors)

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

Cerberus 值强制转换

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

coercing.py

  1. #!/usr/bin/env python3
  2. from cerberus import Validator
  3. from datetime import datetime
  4. def to_date(s):
  5. return datetime.strptime(s, '%Y-%m-%d')
  6. v = Validator()
  7. v.schema = {'start_date': {'type': 'datetime', 'coerce': to_date}}
  8. if v.validate({'start_date': '2019-12-11'}):
  9. print('valid data')
  10. else:
  11. print('invalid data')
  12. print(v.errors)
  13. if v.validate({'start_date': '2019/12/11'}):
  14. print('valid data')
  15. else:
  16. print('invalid data')
  17. print(v.errors)

在示例中,我们使用自定义to_date()函数将数据时间值转换为选定的格式。

  1. $ ./coercing.py
  2. valid data
  3. invalid data
  4. {'start_date': ["field 'start_date' cannot be coerced: time data '2019/12/11' does not
  5. match format '%Y-%m-%d'", 'must be of datetime type']}

这是输出。

使用 YAML 文件

在下一个示例中,我们将数据存储在 YAML 文件中。

cities.yaml

  1. cities:
  2. - Bratislava
  3. - Kosice
  4. - Trnava
  5. - Moldava
  6. - Trencin

该文件包含城市列表。

from_yaml.py

  1. #!/usr/bin/env python3
  2. from cerberus import Validator
  3. import yaml
  4. v = Validator()
  5. v.schema = {'cities': {'type': 'list', 'schema': {'type': 'string'}}}
  6. with open('cities.yaml') as f:
  7. data = yaml.load(f, Loader=yaml.FullLoader)
  8. print(data)
  9. if v.validate({'cities': data['cities']}):
  10. print('valid data')
  11. else:
  12. print('invalid data')
  13. print(v.errors)

我们从 YAML 文件中读取数据并进行验证。 schema规则设置针对列表的所有元素验证定义的规则。

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

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

Cerberus 定制验证器

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

custom_validator.py

  1. #!/usr/bin/env python3
  2. from cerberus import Validator
  3. from dataclasses import dataclass
  4. @dataclass
  5. class Person:
  6. name: str
  7. age: int
  8. class PersonValidator(Validator):
  9. def validate_person(self, obj):
  10. return self.validate(obj.__dict__)
  11. schema = {'name': { 'type': 'string', 'minlength': 2},
  12. 'age': {'type': 'integer', 'min': 18, 'max': 65}}
  13. v = PersonValidator(schema)
  14. p = Person('John Doe', 2)
  15. if v.validate_person(p):
  16. print('valid data')
  17. else:
  18. print('invalid data')
  19. print(v.errors)

在示例中,我们为Person对象定义了一个自定义验证器。

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

您可能也对以下相关教程感兴趣: Python 字符串Python Jinja 教程Python 教程,或列出所有 Python 教程