使用marshmallow时遇到的数据校验错误:ValidationError()指南
使用Marshmallow进行数据校验时,有时可能会遇到ValidationError错误。这个错误通常是由于数据不符合定义的模式或规则而引发的。本指南将带你了解如何使用Marshmallow处理ValidationError错误,并提供一些例子来说明。
首先,让我们明确下Marshmallow的版本。从Marshmallow 3.0起,ValidationError错误的行为有了一些改变。在之前的版本中,校验失败时会抛出ValidationError异常,但现在它变成了一个异常类,可以在Marshmallow的exceptions模块中找到。
以下是一些常见的处理ValidationError错误的方法:
1. 捕获ValidationError并处理错误信息:
from marshmallow import Schema, fields, ValidationError
class UserSchema(Schema):
name = fields.Str(required=True)
age = fields.Int(required=True)
data = {"name": "John"}
try:
user = UserSchema().load(data)
except ValidationError as error:
print(error.messages)
在这个例子中,我们定义了一个UserSchema,其中name和age是必填字段。然后,我们将一个只包含"name"字段的数据传递给load()方法,这会触发ValidationError异常。在捕获到异常后,我们可以通过error.messages获取错误信息。
输出结果会是:{'age': ['Missing data for required field.']}。
2. 添加自定义错误信息:
from marshmallow import Schema, fields, validate, ValidationError
class UserSchema(Schema):
name = fields.Str(
required=True,
error_messages={"required": "Name is required."}
)
age = fields.Int(
required=True,
error_messages={"required": "Age is required."}
)
data = {"age": 25}
try:
user = UserSchema().load(data)
except ValidationError as error:
print(error.messages)
在这个例子中,我们添加了自定义的错误信息。如果required校验失败,我们会显示自定义的错误消息。输出结果会是:{'name': ['Name is required.']}。
3. 在字段级别处理错误信息:
from marshmallow import Schema, fields, validate, ValidationError
class UserSchema(Schema):
name = fields.Str(
required=True,
error_messages={"required": "Name is required."}
)
age = fields.Int(
required=True,
error_messages={"required": "Age is required."}
)
data = {"name": "", "age": "twenty-five"}
try:
user = UserSchema().load(data)
except ValidationError as error:
messages = error.messages
name_errors = messages.get("name")
age_errors = messages.get("age")
print(f"Name errors: {name_errors}")
print(f"Age errors: {age_errors}")
在这个例子中,我们引入了一个错误的age值,以及一个空的name值。通过.get()方法,我们可以在错误信息字典中获取特定字段的错误列表。输出结果会是:
Name errors: ['Name is required.'] Age errors: ['Not a valid integer.']
这里我们分别捕获了name和age字段的错误信息。
这些是一些处理ValidationError错误的常见方法和例子。你可以根据自己的需求添加更多的自定义错误信息和错误处理逻辑。但无论如何,捕获并处理ValidationError是在使用Marshmallow进行数据校验时的常见操作。
