🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 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) 。