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

解析marshmallow中的数据校验错误:常见的ValidationError()问题

发布时间:2023-12-25 08:27:01

Marshmallow是Python中一个常用的数据序列化和数据校验库。在使用Marshmallow进行数据校验时,可能会遇到ValidationError异常,它表示数据校验失败。

下面是解析Marshmallow中的数据校验错误(ValidationError)的常见问题,并提供使用例子:

1. 字段缺失错误(Missing fields):

ValidationError中的messages字典中包含了字段缺失的错误信息。可以通过调用ValidationError.messages来获取具体的错误信息。

例如,假设有一个UserSchema,其中包含了两个字段name和age,如果其中一个字段缺失,就会出现 Missing fields 错误:

from marshmallow import Schema, fields, ValidationError

class UserSchema(Schema):
    name = fields.Str(required=True)
    age = fields.Int(required=True)

data = {"name": "John"}

try:
    UserSchema().load(data)
except ValidationError as e:
    print(e.messages)  # 输出:{"age": ["Missing data for required field."]}

2. 数据类型错误(Data type errors):

ValidationError中的messages字典中也包含了数据类型错误的信息。当传入的数据与期望的数据类型不匹配时,就会抛出数据类型错误。

例如,假设字段age期望是整数类型,但传入的数据是字符串类型,就会出现数据类型错误:

from marshmallow import Schema, fields, ValidationError

class UserSchema(Schema):
    name = fields.Str()
    age = fields.Int()

data = {"name": "John", "age": "25"}

try:
    UserSchema().load(data)
except ValidationError as e:
    print(e.messages)  # 输出:{"age": ["Not a valid integer."]}

3. 自定义校验错误(Custom validation error):

可以通过自定义校验函数来进行进一步的校验,并抛出自定义的ValidationError。

例如,假设字段age的取值范围应该在1到100之间,可以自定义一个校验函数来进行验证:

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

class UserSchema(Schema):
    name = fields.Str()
    age = fields.Int()

    @validates("age")
    def validate_age(self, value):
        if not 1 <= value <= 100:
            raise ValidationError("Age must be between 1 and 100")

data = {"name": "John", "age": 150}

try:
    UserSchema().load(data)
except ValidationError as e:
    print(e.messages)  # 输出:{"age": ["Age must be between 1 and 100"]}

4. 字段格式错误(Field format error):

有时,当传入的数据格式与字段要求的格式不一致时,也会导致数据校验错误。

例如,假设字段name要求是一个字符串,但传入的数据是一个整数,就会出现字段格式错误:

from marshmallow import Schema, fields, ValidationError, validate

class UserSchema(Schema):
    name = fields.Str(validate=validate.Length(min=1))

data = {"name": 123}

try:
    UserSchema().load(data)
except ValidationError as e:
    print(e.messages)  # 输出:{"name": ["Not a valid string."]}

总结:

在使用Marshmallow进行数据校验时,可能会遇到ValidationError异常。常见的ValidationError问题包括字段缺失错误、数据类型错误、自定义校验错误和字段格式错误等。通过理解这些常见问题,并提供合适的错误处理,可以更好地进行数据校验和异常处理。