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

使用marshmallow时遇到的ValidationError()问题及解决方法

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

ValidationError()是marshmallow库中的异常类,用于在进行数据验证时出现错误时抛出。它通常在处理用户输入、API请求或身份验证等情况下使用。

当使用marshmallow进行数据验证时,如果数据不符合定义的模式或规则,就会抛出ValidationError()异常。下面是一些常见的ValidationError()问题和解决方法。

1. 缺少必需字段:

当数据中缺少必需的字段时,会引发ValidationError()。在marshmallow中,可以使用“required=True”设置字段为必需字段。例如:

from marshmallow import Schema, fields, ValidationError

class UserSchema(Schema):
    username = fields.Str(required=True)
    email = fields.Str(required=True)
    
try:
    data = {}
    schema = UserSchema()
    schema.load(data)
except ValidationError as e:
    print(e.messages)

输出结果为:

{'username': ['Missing data for required field.'], 'email': ['Missing data for required field.']}

可以看到,ValidationError()抛出了缺少必需字段的错误。

2. 字段类型不匹配:

当数据中的字段类型与定义的类型不匹配时,也会抛出ValidationError()。例如,如果定义的字段为整数类型,而输入的数据为字符串类型,则会引发ValidationError()。可以使用marshmallow中的fields类来指定字段的类型。例如:

from marshmallow import Schema, fields, ValidationError

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

try:
    data = {'age': 'twenty'}
    schema = UserSchema()
    schema.load(data)
except ValidationError as e:
    print(e.messages)

输出结果为:

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

可以看到,ValidationError()抛出了字段类型不匹配的错误。

3. 数据格式不正确:

当数据格式不符合预期时,也会引发ValidationError()。例如,当验证电子邮件地址时,如果输入的邮箱地址不符合邮箱的格式要求,则会抛出ValidationError()。可以使用marshmallow中的validate参数和相应的验证函数来验证字段的值。例如:

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

class UserSchema(Schema):
    email = fields.Email(validate=validate.Regexp(re.compile(r'^[a-z0-9]+[\._]?[a-z0-9]+[@]\w+[.]\w{2,3}$')))

try:
    data = {'email': 'example.com'}
    schema = UserSchema()
    schema.load(data)
except ValidationError as e:
    print(e.messages)

输出结果为:

{'email': ['Not a valid email address.']}

可以看到,ValidationError()抛出了数据格式不正确的错误。在以上例子中,使用了正则表达式验证邮箱地址的格式。

总之,当使用marshmallow进行数据验证时,可能会遇到各种ValidationError()问题。要解决它们,可以使用required参数设置字段为必需字段,使用validate参数和相应的验证函数来验证数据格式,或者使用fields类指定字段的类型。在捕获ValidationError()异常时,可以使用messages属性获取错误消息。