当前位置: 首页 > article >正文

7 使用 Pydantic 验证 FastAPI 的请求数据

FastAPI 是一个快速、现代的 Web 框架,它提供了自动生成 OpenAPI 文档的功能,支持 Pydantic 模型进行请求和响应数据的验证。Pydantic 提供了强大的数据验证功能,可以帮助你确保请求的有效性,自动进行数据转换,并生成详细的错误信息。

本文将介绍如何使用 Pydantic 验证 FastAPI 请求数据,包括如何处理请求体、查询参数、路径参数等。

1. 安装 FastAPI 和 Uvicorn

首先,如果还没有安装 FastAPI 和 Uvicorn,请运行以下命令进行安装:


pip install fastapi uvicorn

然后,你可以使用 Uvicorn 作为 ASGI 服务器来运行 FastAPI 应用:



uvicorn main:app --reload

2. 使用 Pydantic 验证请求体数据

FastAPI 允许你通过 Pydantic 模型来验证请求体中的数据。你只需要将 Pydantic 模型作为函数参数,FastAPI 会自动处理数据验证和转换。

2.1 定义 Pydantic 模型

首先,定义一个 Pydantic 模型来描述请求体的数据结构。例如,我们要创建一个用户注册接口,接收用户的姓名、年龄和邮箱地址。

from pydantic import BaseModel

class User(BaseModel):
    name: str
    age: int
    email: str

在这个模型中:

  • nameageemail 是用户提交的数据字段。
  • strint 是字段的数据类型,Pydantic 会自动验证和转换这些字段的数据。

2.2 定义 FastAPI 路由

然后,定义一个 FastAPI 路由来接收用户数据,并使用 Pydantic 模型进行验证。

from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()

class User(BaseModel):
    name: str
    age: int
    email: str

@app.post("/users/")
async def create_user(user: User):
    return {"name": user.name, "age": user.age, "email": user.email}

在上面的代码中:

  • create_user 路由会接收一个 User 类型的请求体。
  • Pydantic 会自动验证请求体中的数据,如果数据无效(如类型错误或缺少必填字段),FastAPI 会返回 422 错误和详细的错误信息。

2.3 测试 API

现在,我们可以启动应用并通过 POST 请求来测试 API。例如,使用 curl 发送一个有效的请求:

curl -X 'POST' 'http://127.0.0.1:8000/users/' \
-H 'Content-Type: application/json' \
-d '{
    "name": "Alice",
    "age": 30,
    "email": "alice@example.com"
}'

响应将是:

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

如果传入的数据无效(如 age 字段是字符串而不是整数),FastAPI 会返回 422 错误,响应如下:

{
  "detail": [
    {
      "loc": ["body", "age"],
      "msg": "value is not a valid integer",
      "type": "type_error.integer"
    }
  ]
}

3. 验证查询参数和路径参数

除了请求体,FastAPI 还支持使用 Pydantic 验证查询参数和路径参数。

3.1 路径参数

FastAPI 允许你在路径中定义参数并进行验证。例如,我们可以定义一个路由来接收一个用户 ID,并返回该用户的基本信息:

@app.get("/users/{user_id}")
async def get_user(user_id: int):
    return {"user_id": user_id}

在上面的代码中,user_id 是一个路径参数,FastAPI 会自动将其转换为整数,并验证其类型。如果传入的 user_id 无法转换为整数,FastAPI 会自动返回 422 错误。

3.2 查询参数

你还可以使用 Pydantic 验证查询参数。例如,我们可以让用户提供一个查询参数 q,来根据关键字查询用户:

from typing import Optional

@app.get("/users/")
async def search_users(q: Optional[str] = None):
    return {"query": q}

在这个例子中,q 是一个查询参数,它是可选的。如果没有传入查询参数,q 的默认值为 None

你可以通过如下方式访问:

curl -X 'GET' 'http://127.0.0.1:8000/users/?q=Alice'

响应将是:

{
  "query": "Alice"
}

3.3 类型验证与转换

FastAPI 会自动验证查询参数的类型。如果你希望查询参数是整数类型,可以在参数声明中指定类型:

@app.get("/items/")
async def get_item(item_id: int):
    return {"item_id": item_id}

如果你访问 /items/?item_id=42,FastAPI 会自动将 item_id 转换为整数。如果传入无效类型(例如 item_id=abc),则 FastAPI 会返回 422 错误。

4. 自定义验证

如果你希望在 Pydantic 模型中进行更复杂的验证,可以使用 @validator 装饰器。假设你希望验证用户的 email 字段,确保它符合正确的格式:

from pydantic import validator, BaseModel

class User(BaseModel):
    name: str
    age: int
    email: str

    @validator('email')
    def email_format(cls, v):
        if '@' not in v:
            raise ValueError('Email must contain @ symbol')
        return v

如果提交的邮箱不包含 @ 符号,FastAPI 会抛出验证错误并返回相应的错误信息。

在 FastAPI 中,Pydantic 用于轻松地进行请求数据的验证和处理。通过定义 Pydantic 模型,你可以快速验证请求体、查询参数、路径参数等,并自动处理数据转换。FastAPI 会自动根据你的模型生成 API 文档,并且会在请求数据无效时提供详细的错误信息。

Pydantic 的强大验证能力和 FastAPI 的高效集成使得构建健壮的 API 变得更加简单。
在这里插入图片描述


http://www.kler.cn/a/539954.html

相关文章:

  • git rebase 和 git merge的区别
  • 2025web寒假作业二
  • 哪吒闹海!SCI算法+分解组合+四模型原创对比首发!SGMD-FATA-Transformer-LSTM多变量时序预测
  • SQLAlchemy 的内存消耗
  • 网络协议课程笔记上
  • 【Python】元组
  • 网站快速收录策略:提升爬虫抓取效率
  • 2025Stable Diffusion WebUI详细使用指南
  • Spring Boot Actuator EndPoints(官网文档解读)
  • Android Camera API 介绍
  • 【LLM】DeepSeek R1训练成本降低分析篇
  • c++ haru生成pdf输出饼图
  • 安卓基础(Okhttp3)
  • ZooKeeper 技术全解:概念、功能、文件系统与主从同步
  • 【SQL技术】不同数据库引擎 SQL 优化方案剖析
  • 软件测试之通用功能测试点
  • Visual Basic语言的图形用户界面
  • 位运算算法篇:异或运算
  • webpack配置语言之---ts
  • 用DeepSeek写小程序指令技巧
  • doris:MySQL 兼容性
  • 【含开题报告+文档+PPT+源码】基于SpringBoot+Vue旅游管理网站
  • PromptSource官方文档翻译
  • 我准备做一个24H的摄像机模拟器,用录像视频模拟实时画面,如果能支持时间水印就更好了
  • user、assistant、system三大角色在大语言模型中的作用(通俗解释)
  • 荣耀已接入DeepSeek-R1,荣耀手机系统版本MagicOS8.0及以上用户可用