20 数据验证与序列化之使用Pydantic进行数据验证

在上一篇文章中,我们介绍了如何使用 Pydantic 定义数据模型。此篇将深入探讨如何使用 Pydantic 进行数据验证与序列化。Pydantic 是 FastAPI 中的数据验证和解析的核心组件,它使得我们的工作变得更加简单和高效。

什么是数据验证?

数据验证是确保输入数据符合预期规范的过程。通过数据验证,我们可以确保数据的完整性和一致性,从而提高应用程序的可靠性。Pydantic 提供了一种便捷的方式来定义验证规则,并自动 validate 输入数据。

Pydantic 的基本用法

在 Pydantic 中,我们首先定义一个模型(model),然后可以使用该模型来验证输入的数据。以下是一个基本示例,展示了如何使用 Pydantic 模型:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from pydantic import BaseModel, EmailStr, conint

class User(BaseModel):
name: str
email: EmailStr
age: conint(ge=18) # 年龄必须大于或等于 18 的整数

# 示例数据
user_data = {
"name": "Alice",
"email": "alice@example.com",
"age": 30
}

user = User(**user_data)
print(user)

在这个示例中,我们定义了一个 User 模型,它包含了 nameemailage 字段。Pydantic 会自动验证这些字段的类型和约束条件。

输入验证

当创建一个用户对象时,Pydantic 会检查提供的数据是否符合模型定义。如果数据无效,Pydantic 会抛出一个 ValidationError。例如:

1
2
3
4
5
6
7
8
9
10
invalid_user_data = {
"name": "Bob",
"email": "not-an-email",
"age": 15 # 这里应该抛出验证错误
}

try:
user = User(**invalid_user_data)
except ValidationError as e:
print(e.json())

在这个例子中,email 字段不符合 EmailStr 的格式,且 age 字段小于 18,Pydantic 将会返回详细的错误信息。

数据序列化

Pydantic 模型不仅可以用于验证,也可以轻松地将数据序列化为字典或 JSON 格式。使用 dict()json() 方法,可以将 Pydantic 对象转换为所需的格式:

1
2
3
4
5
user_json = user.json()
print(user_json) # 输出用户的 JSON 表示

user_dict = user.dict()
print(user_dict) # 输出用户的字典表示

定制序列化

Pydantic 还支持自定义字段序列化。您可以使用 Field 类来定义字段的别名或默认值。下面是一个简单的示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from pydantic import Field

class User(BaseModel):
name: str
email: EmailStr
age: conint(ge=18)
is_active: bool = Field(default=True, alias='active_status')

user_data = {
"name": "Alice",
"email": "alice@example.com",
"age": 30
}

user = User(**user_data)
print(user.dict(by_alias=True)) # 使用别名序列化

在这个例子中,字段 is_active 被定义为 active_status 的别名。在转换为字典时,我们可以通过 by_alias=True 参数来使用别名进行序列化。

配合 FastAPI 使用

在 FastAPI 中,当定义一个接收 POST 请求的路由时,可以直接使用 Pydantic 模型作为请求体。FastAPI 将会自动处理数据验证和解析。例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
from fastapi import FastAPI
from pydantic import BaseModel, EmailStr, conint

app = FastAPI()

class User(BaseModel):
name: str
email: EmailStr
age: conint(ge=18)

@app.post("/users/")
async def create_user(user: User):
return user

这样,FastAPI 会自动验证请求数据,并将有效数据转换为 User 对象。对于无效数据,FastAPI 会直接返回 422 状态码及验证错误信息,而无需手动处理。

小结

本篇文章详细讲解了如何使用 Pydantic 进行数据验证与序列化,从基本的数据模型定义到错误处理、序列化以及在 FastAPI 中的使用。通过 Pydantic,我们可以高效地管理数据的完整性和一致性,减少了因为数据错误而导致的问题。

在下一篇文章中,我们将讨论如何实现自定义验证逻辑,进一步增强 Pydantic 模型的功能。敬请期待!

20 数据验证与序列化之使用Pydantic进行数据验证

https://zglg.work/python-fastapi-zero/20/

作者

IT教程网(郭震)

发布于

2024-08-17

更新于

2024-08-18

许可协议

分享转发

交流

更多教程加公众号

更多教程加公众号

加入星球获取PDF

加入星球获取PDF

打卡评论