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

在 FastAPI 项目中使用 Python 注解类型实现通用返回结构

前言

在开发 API 时,确保一致的响应结构是一个良好的实践。无论是前端开发人员还是后端开发人员,都希望能够依赖一个统一的返回格式,这样可以简化调试和处理逻辑。在这篇文章中,我们将探讨如何在 FastAPI 项目中使用 Python 的注解类型和 pydantic 模块来实现一个通用的返回结构。

1. 快速入门:安装 FastAPI 和 Uvicorn

如果你还没有安装 FastAPI 和 Uvicorn,可以通过以下命令进行安装:

pip install fastapi uvicorn

FastAPI 是一个现代的、快速的(高性能的)Web框架,用于构建基于标准 Python 类型提示的 API,Uvicorn 是一个用于运行 ASGI 应用的轻量级和快速的 ASGI 服务器。

2. 定义通用返回结构

为了实现一个统一的响应结构,我们首先需要定义一个通用的响应模型。在 Python 中,我们可以使用 pydanticBaseModel 来实现这个结构。

from fastapi import FastAPI
from pydantic import BaseModel
from typing import Generic, TypeVar, Optional
# 定义一个泛型类型变量
T = TypeVar('T')
# 定义通用响应模型
class ResponseModel(Generic[T], BaseModel):code: intmessage: strdata: Optional[T] = Noneclass Config:# 允许使用泛型模型arbitrary_types_allowed = True

解释:

  • 泛型类型变量 T:通过使用泛型,ResponseModel 可以接收任意类型的数据(例如列表、字典、字符串等),并将其包装在一个统一的响应结构中。
  • code: intmessage: str:这两个字段表示 API 的响应状态码和消息,方便前端判断和展示。
  • data: Optional[T]:表示实际的数据内容,该字段是可选的,可以为任何类型的数据。

3. 创建 FastAPI 应用并使用通用响应模型

接下来,我们将创建一个简单的 FastAPI 应用,演示如何使用上面定义的通用响应模型。

from fastapi import FastAPI, HTTPException
from typing import List
app = FastAPI()
# 定义一个数据模型
class Item(BaseModel):id: intname: strdescription: Optional[str] = None
# 定义一个返回包含多个Item的响应模型
ItemListResponse = ResponseModel[List[Item]]
@app.get("/items/", response_model=ItemListResponse)
async def get_items():items = [Item(id=1, name="Item 1", description="This is item 1"),Item(id=2, name="Item 2", description="This is item 2"),]return ItemListResponse(code=200, message="Success", data=items)
@app.get("/items/{item_id}", response_model=ResponseModel[Item])
async def get_item(item_id: int):if item_id == 1:item = Item(id=1, name="Item 1", description="This is item 1")return ResponseModel(code=200, message="Success", data=item)else:raise HTTPException(status_code=404, detail="Item not found")

解释:

  • Item 数据模型Item 类表示我们 API 中的一个项目,每个项目有 idname 和可选的 description 字段。
  • ItemListResponse:我们使用 ResponseModel[List[Item]] 定义了一个返回多个 Item 的响应结构。
  • get_itemsget_item:这两个路由函数演示了如何使用通用响应模型来返回数据。如果请求成功,返回的数据将包含在 data 字段中,并且 codemessage 字段将传递额外的状态信息。

4. 启动应用并访问 API

你可以使用以下命令运行 FastAPI 应用:

uvicorn main:app --reload

启动应用后,你可以通过以下 URL 访问 API 并查看响应结构:

  • http://127.0.0.1:8000/items/ 获取所有项目信息。
  • http://127.0.0.1:8000/items/1 获取特定项目的详细信息。

5. 结论

通过在 FastAPI 项目中实现通用返回结构,我们可以确保所有 API 响应都遵循一致的格式。这不仅有助于提升代码的可维护性,还可以让前端开发人员更轻松地处理数据。使用 Python 的注解类型和 pydantic,我们能够灵活地定义响应模型,并通过泛型支持多种数据类型。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • docker的基本管理和应用
  • Linux磁盘管理与文件系统(二):实用工具和命令、fdisk分区示例
  • 【QGroundControl二次开发】十. QT添加GStreamer视频播放同时保存
  • 【C++ 秘籍】解锁 stack、queue 和 priority_queue 及容器适配器的神奇世界
  • haproxy七层代理
  • C++构造和析构
  • `torch.device(“mps“)`、pip华为镜像源dockerfile以及后缀安装
  • 华为OD笔试
  • C#开启和关闭UAC功能
  • MySQL —— 约束
  • 周报 | 24.8.5-24.8.11文章汇总
  • Ubuntu安装MySQL5.7 + Apache + PHP + 禅道 保姆及教程
  • 糟糕界面集锦-控件篇05
  • XML动态sql查询当前时间之前的信息报错
  • 【数据结构进阶】哈希的应用
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • 〔开发系列〕一次关于小程序开发的深度总结
  • ES6语法详解(一)
  • express如何解决request entity too large问题
  • Javascript 原型链
  • Java基本数据类型之Number
  • jQuery(一)
  • PaddlePaddle-GitHub的正确打开姿势
  • React-flux杂记
  • SAP云平台里Global Account和Sub Account的关系
  • SQL 难点解决:记录的引用
  • SQLServer之创建显式事务
  • Vue2 SSR 的优化之旅
  • Vue小说阅读器(仿追书神器)
  • Web Storage相关
  • 从零开始的无人驾驶 1
  • 动态规划入门(以爬楼梯为例)
  • 对象引论
  • 规范化安全开发 KOA 手脚架
  • 删除表内多余的重复数据
  • 使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • ​【数据结构与算法】冒泡排序:简单易懂的排序算法解析
  • ​Base64转换成图片,android studio build乱码,找不到okio.ByteString接腾讯人脸识别
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • # 达梦数据库知识点
  • (el-Date-Picker)操作(不使用 ts):Element-plus 中 DatePicker 组件的使用及输出想要日期格式需求的解决过程
  • (LeetCode 49)Anagrams
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (SpringBoot)第七章:SpringBoot日志文件
  • (附源码)springboot码头作业管理系统 毕业设计 341654
  • (附源码)ssm基于web技术的医务志愿者管理系统 毕业设计 100910
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (四)linux文件内容查看
  • .net dataexcel winform控件 更新 日志
  • .NET MAUI学习笔记——2.构建第一个程序_初级篇
  • .NET简谈互操作(五:基础知识之Dynamic平台调用)