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

解析marshmallow中的ValidationError()异常:常见问题及解决方法

发布时间:2023-12-25 08:23:28

marshmallow中的ValidationError()异常是用来处理验证过程中出现的错误的异常类。它是marshmallow包中的一个内置异常类。当数据验证失败时,将引发ValidationError()异常,并包含有关错误的信息。在此文章中,我们将讨论一些常见的ValidationError()异常,并提供解决方法和相关示例代码。

ValidationError()异常常见问题及解决方法:

1. 缺少必填字段:当验证过程中遇到必填字段缺失时,将引发ValidationError()异常。解决方法是确保必填字段在数据中存在,并且不为None。

from marshmallow import ValidationError, fields, Schema

class MySchema(Schema):
    name = fields.String(required=True)

data = {} # 缺少必填字段name
try:
    result = MySchema().load(data)
except ValidationError as err:
    print(err.messages)  # {'name': ['Missing data for required field.']}

data = {'name': None} # 必填字段name为None
try:
    result = MySchema().load(data)
except ValidationError as err:
    print(err.messages)  # {'name': ['Field may not be null.']}

2. 字段类型错误:当验证过程中遇到字段类型错误时,将引发ValidationError()异常。解决方法是确保传入的数据类型与字段定义的类型相匹配。

from marshmallow import ValidationError, fields, Schema

class MySchema(Schema):
    age = fields.Integer()

data = {'age': 'twenty'} # 字段age应为整型,但传入了字符串
try:
    result = MySchema().load(data)
except ValidationError as err:
    print(err.messages)  # {'age': ['Not a valid integer.']}

3. 无效字段:当验证过程中遇到未定义的字段时,将引发ValidationError()异常。解决方法是检查数据中的字段是否与Schema定义中的字段相匹配。

from marshmallow import ValidationError, fields, Schema

class MySchema(Schema):
    name = fields.String()

data = {'age': 25} # 数据中的字段age在Schema中未定义
try:
    result = MySchema().load(data)
except ValidationError as err:
    print(err.messages)  # {'age': ['Unknown field.']}

data = {'name': 'John', 'email': 'john@example.com'} # 数据中的字段email在Schema中未定义
try:
    result = MySchema().load(data)
except ValidationError as err:
    print(err.messages)  # {'email': ['Unknown field.']}

4. 字段验证错误:当验证过程中遇到字段验证失败时,将引发ValidationError()异常。解决方法是在字段定义中指定适当的验证器,并确保数据满足验证条件。

from marshmallow import ValidationError, fields, Schema, validates

class MySchema(Schema):
    age = fields.Integer()

    @validates('age')
    def validate_age(self, value):
        if value < 0:
            raise ValidationError('Age should be a positive number.')

data = {'age': -25} # 年龄应为正数,但传入了负数
try:
    result = MySchema().load(data)
except ValidationError as err:
    print(err.messages)  # {'age': ['Age should be a positive number.']}

5. 嵌套字段错误:当验证过程中遇到嵌套字段验证失败时,将引发ValidationError()异常。解决方法是在嵌套字段的Schema对象上进行递归验证。

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

class AddressSchema(Schema):
    street = fields.String()
    city = fields.String()
    state = fields.String(validate=validate.Length(equal=2))

class UserSchema(Schema):
    name = fields.String()
    address = fields.Nested(AddressSchema)

data = {'name': 'John', 'address': {'street': '123 Main St', 'city': 'New York', 'state': 'NYC'}}
try:
    result = UserSchema().load(data)
except ValidationError as err:
    print(err.messages)  # {'address': {'state': ['Shorter than minimum length 2.']}}

总结:

本文讨论了marshmallow中的ValidationError()异常,并提供了常见问题及解决方法的示例代码。通过捕获并处理ValidationError()异常,我们可以更好地处理数据验证过程中的错误,从而提高数据的准确性和一致性。