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

解析marshmallow中的数据校验错误:ValidationError()异常指南

发布时间:2023-12-25 08:25:55

Marshmallow是一个Python库,用于将复杂的数据结构转换为Python对象,以及将Python对象转换为字典或JSON格式。它还提供了数据校验功能,用于验证输入数据的有效性。当数据校验不通过时,Marshmallow会引发ValidationError异常。本指南将介绍如何处理和解析Marshmallow中的数据校验错误,并提供一些使用示例。

一、什么是ValidationError异常?

ValidationError异常是Marshmallow库中用于表示数据校验错误的异常。当输入数据不符合定义的模式或规则时,Marshmallow会引发此异常。ValidationError异常包含一个errors属性,其中包含了所有的数据校验错误。

二、解析ValidationError异常

要解析ValidationError异常,可以使用try-except语句捕获异常,并遍历errors属性获取具体的错误信息。以下是解析ValidationError异常的示例代码:

from marshmallow import Schema, fields, ValidationError

class UserSchema(Schema):
    name = fields.String(required=True)
    age = fields.Integer()

user_data = {
    'name': 'John',
    'age': 'twenty'
}

try:
    user = UserSchema().load(user_data)
except ValidationError as err:
    errors = err.messages
    print(errors)

在上面的示例代码中,UserSchema定义了name和age两个字段,并且name字段是必需的。在try语句中,我们尝试使用load方法来加载user_data。由于age字段的值为字符串'twenty',不是一个有效的整数,所以会触发ValidationError异常。在except语句中,我们可以通过err.messages属性获取具体的错误信息。

运行上面的代码,输出的结果将会是:

{'age': ['Not a valid integer.']}

这说明age字段的值不是一个有效的整数。

三、使用data_key参数自定义错误信息

如果我们想自定义错误信息,可以使用Marshmallow的data_key参数。data_key参数可以用于指定字段在输入数据中的键名,并且可以自定义错误消息。以下是一个使用data_key参数的示例:

from marshmallow import Schema, fields, ValidationError

class UserSchema(Schema):
    name = fields.String(required=True, data_key='username')
    age = fields.Integer()

user_data = {
    'username': 'John',
    'age': 'twenty'
}

try:
    user = UserSchema().load(user_data)
except ValidationError as err:
    errors = err.messages
    print(errors)

在上面的示例代码中,我们通过data_key参数将name字段的键名设置为'username'。当出现数据校验错误时,错误信息将会使用data_key参数指定的键名。运行上面的代码,输出的结果将会是:

{'username': ['Not a valid integer.']}

四、子模式的数据校验错误

如果我们的模式包含子模式,当子模式的数据校验出错时,Marshmallow会将子模式的校验错误嵌套在父模式的校验错误中。以下是一个包含子模式的示例:

from marshmallow import Schema, fields, ValidationError

class AddressSchema(Schema):
    street = fields.String(required=True)
    city = fields.String(required=True)

class UserSchema(Schema):
    name = fields.String(required=True)
    age = fields.Integer()
    address = fields.Nested(AddressSchema)

user_data = {
    'name': 'John',
    'age': 25,
    'address': {
        'street': '123 Main St',
        'city': 'New York'
    }
}

try:
    user = UserSchema().load(user_data)
except ValidationError as err:
    errors = err.messages
    print(errors)

在上面的示例代码中,UserSchema包含一个address字段,它的模式由AddressSchema定义。运行上述代码,将不会触发ValidationError异常,因为输入数据符合定义的模式。

如果我们修改user_data的值,使其不符合AddressSchema的模式,将会触发ValidationError异常。以下是一个示例:

user_data = {
    'name': 'John',
    'age': 25,
    'address': {
        'street': '123 Main St'
    }
}

try:
    user = UserSchema().load(user_data)
except ValidationError as err:
    errors = err.messages
    print(errors)

运行上述代码,输出的结果将会是:

{'address': {'city': ['Missing data for required field.']}}

这说明address字段的city属性缺失,不符合AddressSchema的模式。

总结:

Marshmallow库提供了强大的数据校验功能,并使用ValidationError异常来表示数据校验错误。我们可以使用try-except语句捕获ValidationError异常,遍历errors属性获取具体的错误信息。此外,通过使用data_key参数和嵌套模式,我们可以自定义错误消息和处理复杂的数据结构。希望本指南能帮助您更好地理解和处理Marshmallow中的数据校验错误。