欢迎访问宙启技术站
智能推送

marshmallow中的数据校验错误处理技巧:ValidationError()指南

发布时间:2023-12-25 08:24:05

marshmallow 是一个用于序列化和反序列化数据的 Python 库。它通过定义对象的结构和验证规则来处理数据的序列化和反序列化,以及数据校验错误的处理。

在 marshmallow 中,可以使用 ValidationError() 来处理数据校验错误。ValidationError 是 Marshmallow 库中的异常类,用于表示数据校验失败的情况。下面是一些使用 ValidationError 处理数据校验错误的技巧和示例。

1. 定义 Schema 类

首先需要定义一个 Schema 类来描述数据的结构和验证规则。Schema 类是 Marshmallow 的核心组件,用于定义数据的序列化和反序列化规则。以下是一个示例 Schema 类的定义。

from marshmallow import Schema, fields

class UserSchema(Schema):
    name = fields.Str(required=True)
    age = fields.Integer(required=True, validate=lambda n: n > 0)

在上面的示例中,定义了一个 UserSchema 类,该类有两个字段 name 和 age。name 字段是必需的,并且类型是字符串;age 字段也是必需的,并且类型是整数,同时要求大于 0。

2. 反序列化数据

使用 Schema 类的 load 方法进行数据的反序列化,即将原始数据转换为 Python 对象。load 方法接收一个字典作为输入,并返回一个验证通过的 Python 对象。

data = {'name': 'Alice', 'age': 25}
schema = UserSchema()
try:
    user = schema.load(data)
except ValidationError as e:
    print(e.messages)  # 打印数据校验错误信息

在上面的示例中,首先定义了一个字典 data,然后创建了一个 UserSchema 对象 schema。然后使用 schema 的 load 方法来验证数据,并将验证通过的数据转换为一个 User 对象。如果数据校验失败,会抛出一个 ValidationError 异常,并打印错误信息。

3. 序列化数据

使用 Schema 类的 dump 方法进行数据的序列化,即将 Python 对象转换为一个字典,以便于存储或传输。

user = {'name': 'Alice', 'age': 25}
schema = UserSchema()
try:
    data = schema.dump(user)
except ValidationError as e:
    print(e.messages)  # 打印数据校验错误信息

在上面的示例中,首先定义了一个字典 user,然后创建了一个 UserSchema 对象 schema。然后使用 schema 的 dump 方法来序列化数据,并将结果保存在一个字典 data 中。如果数据校验失败,会抛出一个 ValidationError 异常,并打印错误信息。

4. 自定义错误消息

可以为字段添加自定义错误消息,以便在数据校验失败时提供更加详细的错误信息。

from marshmallow import Schema, fields, validate

class UserSchema(Schema):
    name = fields.Str(required=True, error_messages={'required': '名字不能为空'})
    age = fields.Integer(required=True, validate=validate.Range(min=0), error_messages={'required': '年龄不能为空', 'range': '年龄必须大于等于0'})

在上面的示例中,name 字段的错误消息被设置为 '名字不能为空';age 字段的错误消息被设置为 '年龄不能为空' 和 '年龄必须大于等于0'。

5. 使用错误处理装饰器

使用 marshmallow 提供的错误处理装饰器,可以方便地处理数据校验错误。例如,使用 error_handler 装饰器来打印错误消息。

from marshmallow import Schema, fields, ValidationError, validates, ValidationError

class UserSchema(Schema):
    name = fields.Str(required=True)
    age = fields.Integer(required=True, validate=validate.Range(min=0))

    @validates('age')
    def validate_age(self, value):
        if value < 18:
            raise ValidationError('年龄必须大于等于18')

@UserSchema.error_handler
def handle_error(error, **kwargs):
    print(error.messages)

data = {'name': 'Alice', 'age': 10}
schema = UserSchema()
user = schema.load(data)

在上面的示例中,首先定义了一个 UserSchema 类,并在 age 字段上添加了一个 validates 装饰器来自定义验证函数。如果数据校验失败,会抛出一个 ValidationError 异常。然后使用 error_handler 装饰器来定义一个错误处理函数 handle_error,该函数用于处理数据校验错误。最后,在 load 方法中捕获并处理错误消息。

总结:

- marshmallow 是一个用于序列化和反序列化数据的 Python 库。

- 使用 ValidationError() 来处理数据校验错误。

- 定义 Schema 类来描述数据的结构和验证规则。

- 使用 load 方法进行数据的反序列化,并处理数据校验错误。

- 使用 dump 方法进行数据的序列化,并处理数据校验错误。

- 可以为字段添加自定义错误消息。

- 使用错误处理装饰器来处理数据校验错误。