marshmallow中的数据校验错误处理技巧:ValidationError()指南
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 方法进行数据的序列化,并处理数据校验错误。
- 可以为字段添加自定义错误消息。
- 使用错误处理装饰器来处理数据校验错误。
