Jupyter AI

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

📅 发表日期: 2024年8月18日

分类: 🚀Python FastAPI 入门

👁️阅读: --

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

什么是数据验证?

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

Pydantic 的基本用法

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

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。例如:

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 对象转换为所需的格式:

user_json = user.json()
print(user_json)  # 输出用户的 JSON 表示

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

定制序列化

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

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 将会自动处理数据验证和解析。例如:

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 模型的功能。敬请期待!

🚀Python FastAPI 入门 (滚动鼠标查看)