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

使用marshmallow时遇到的数据校验错误:ValidationError()指南

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

使用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,其中nameage是必填字段。然后,我们将一个只包含"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.']

这里我们分别捕获了nameage字段的错误信息。

这些是一些处理ValidationError错误的常见方法和例子。你可以根据自己的需求添加更多的自定义错误信息和错误处理逻辑。但无论如何,捕获并处理ValidationError是在使用Marshmallow进行数据校验时的常见操作。