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

news2025/2/11 8:48:57

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.coloradmin.cn/o/2295660.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

U3D支持webgpu阅读

https://docs.unity3d.com/6000.1/Documentation/Manual/WebGPU-features.html 这里看到已经该有的差不多都有了 WOW VFX更是好东西 https://unity.com/cn/features/visual-effect-graph 这玩意儿化简了纯手搓一个特效的流程 如果按原理说就是compute shader刷position&#…

Mac安装配置使用nginx的一系列问题

brew安装nginx https://juejin.cn/post/6986190222241464350 使用brew安装nginx,如下命令所示: brew install nginx 如下图所示: 2.查看nginx的配置信息,如下命令: brew info nginxFrom:xxx 这样的,是n…

在CT107D单片机综合训练平台上,8个数码管分别单独依次显示0~9的值,然后所有数码管一起同时显示0~F的值,如此往复。

题目:在CT107D单片机综合训练平台上,8个数码管分别单独依次显示0~9的值,然后所有数码管一起同时显示0~F的值,如此往复。 延时函数分析LED首先实现8个数码管单独依次显示0~9的数字所有数码管一起同时显示0~F的值,如此往…

组件库选择:ElementUI 还是 Ant Design

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

从运输到植保:DeepSeek大模型探索无人机智能作业技术详解

DeepSeek,作为一家专注于深度学习与人工智能技术研究的企业,近年来在AI领域取得了显著成果,尤其在无人机智能作业技术方面展现了其大模型的强大能力。以下是从运输到植保领域,DeepSeek大模型探索无人机智能作业技术的详解&#xf…

超越LSTM!TCN模型如何精准预测股市波动(附代码)

作者:老余捞鱼 原创不易,转载请标明出处及原作者。 写在前面的话:最近我用TCN时间卷积网络预测了标普500指数(SPX)的每日回报率,发现效果远超传统方法。TCN通过因果卷积和膨胀卷积捕捉时间序列的长期依赖关…

[每周一更]-(第133期):Go中MapReduce架构思想的使用场景

文章目录 **MapReduce 工作流程**Go 中使用 MapReduce 的实现方式:**Go MapReduce 的特点****哪些场景适合使用 MapReduce?**使用场景1. 数据聚合2. 数据过滤3. 数据排序4. 数据转换5. 数据去重6. 数据分组7. 数据统计8.**统计文本中单词出现次数****代码…

QML初识

目录 一、关于QML 二、布局定位和锚点 1.布局定位 2.锚点详解 三、数据绑定 1.基本概念 2.绑定方法 3.数据模型绑定 四、附加属性及信号 1.附加属性 2.信号 一、关于QML QML是Qt框架中的一种声明式编程语言,用于描述用户界面的外观和行为;Qu…

查询已经运行的 Docker 容器启动命令

一、导语 使用 get_command_4_run_container 查询 docker 容器的启动命令 获取镜像 docker pull cucker/get_command_4_run_container 查看容器命令 docker run --rm -v /var/run/docker.sock:/var/run/docker.sock cucker/get_command_4_run_container 容器id或容器名 …

协议_CAN协议

物理层特征 信号传输原理: CAN控制器根据CAN_L和CAN_H上的电位差来判断总线电平,总线电平分为显性电平(CAN_H与CAN_L压差 2v)、隐性电平(CAN_H与CAN_L压差 0v),发送方通过总线电平的变化&am…

QT修仙之路2-2 对话框 尚欠火候

警告对话框 相关代码 错误对话框 相关代码 消息对话框 相关代码 询问对话框 相关代码 相关代码 警告对话框 QMessageBox::warning(this,"错误","账号密码不能为空",QMessageBox::Ok);错误对话框 QMessageBox msgBox(QMessageBox::Critical,"错误…

NFT Insider #168:The Sandbox 推出新春{金蛇礼服}套装;胖企鹅合作 LINE Minini

引言:NFT Insider 由 NFT 收藏组织 WHALE Members、BeepCrypto 联合出品, 浓缩每周 NFT 新闻,为大家带来关于 NFT 最全面、最新鲜、最有价值的讯息。每期周报将从 NFT 市场数据,艺术新闻类,游戏新闻类,虚拟…

什么是deepseek?

AI国产免费开源强大 DeepSeek 是由国内团队开发的一款开源人工智能工具库,专注于提供高效易用的 AI 模型训练与推理能力。它既包含预训练大语言模型(如 DeepSeek-R1 系列),也提供配套工具链,助力开发者快速实现 AI 应用…

容器服务基础

1.腾讯云容器服务 使用该服务,开发者将无需安装、运维、扩展您的集群管理基础设施,只需进行简单的API调用,便可启动和停止 Docker 应用程序,查询集群的完整状态,以及使用各种云服务。 创建集群--创建工作负载/创建ingr…

C++基础知识(二)之数据类型、指针和内存、数组

六、C数据类型 1、sizeof运算符 sizeof运算符用于求数据类型或变量占用的内存空间。 用于数据类型:sizeof(数据类型) 用于变量:sizeof(变量名) 或 sizeof 变量名 注意: 在32位和64位操作系统中,同一种数据类型占用的内存空间…

LLMs之DeepSeek r1:Logic-RL的简介、安装和使用方法、案例应用之详细攻略

LLMs之DeepSeek r1:Logic-RL的简介、安装和使用方法、案例应用之详细攻略 目录 Logic-RL的简介 1、Logic-RL的特点 2、性能 Logic-RL 的安装和使用方法 1、安装 2、使用方法 数据准备 基础模型 指令模型 训练执行 实现细节 Logic-RL的案例应用 Logic-RL…

【神经网络框架】非局部神经网络

一、非局部操作的数学定义与理论框架 1.1 非局部操作的通用公式 非局部操作(Non-local Operation)是该研究的核心创新点,其数学定义源自经典计算机视觉中的非局部均值算法(Non-local Means)。在深度神经网络中,非局部操作被形式化为: 其中: 1.2 与传统操作的对比分析…

22.[前端开发]Day22-CSS单位-CSS预处理器-移动端视口

1 CSS常见单位详解 CSS中的单位 CSS中的绝对单位( Absolute length units ) CSS中的相对单位( Relative length units ) 1.em: 相对自己的font-size;如果自己没有设置, 那么会继承父元素的font-size 2.如果font-size中…

URL调用本地Ollama模型

curl http://192.168.2.247:11434/api/generate -d "{ \"model\": \"deepseek-r1:8b\", \"prompt\": \"Who r u?\" ,\"stream\":false}" 连续对话

【python】matplotlib(animation)

文章目录 1、matplotlib.animation1.1、FuncAnimation1.2、修改 matplotlib 背景 2、matplotlib imageio2.1、折线图2.2、条形图2.3、散点图 3、参考 1、matplotlib.animation 1.1、FuncAnimation matplotlib.animation.FuncAnimation 是 Matplotlib 库中用于创建动画的一个…