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

深入理解FastAPI的response_model:自动化数据验证与文档生成

使用 FastAPI 的 response_model 参数

在构建 RESTful API 时,确保数据的一致性和正确性是非常重要的。FastAPI 提供了强大的工具来帮助开发者实现这一目标。其中一个关键特性是 response_model 参数,它允许开发者定义期望的响应格式,并自动处理数据的序列化、验证和文档生成。

什么是 response_model

response_model 是 FastAPI 中的一个参数,它用于声明 API 响应的数据模型。这不仅可以确保响应数据的类型正确,还可以自动验证数据,并在 API 文档中为响应添加 JSON Schema。这意味着,使用 response_model,你可以减少手动编写和验证代码的工作量,同时提高 API 的可维护性和可读性。

response_model 的类型

response_model 可以接收多种类型的参数,包括:

  1. Pydantic 模型:这是最直接的用法,你可以定义一个 Pydantic 模型来描述响应的数据结构。
  2. Pydantic 模型列表:如果你的 API 需要返回一个对象列表,你可以使用 List[Model] 来声明。
response_model 的作用

使用 response_model 有以下几个好处:

  1. 数据转换:FastAPI 会自动将输出数据转换为声明的类型。
  2. 数据验证:在发送响应之前,FastAPI 会验证数据是否符合模型定义。
  3. JSON Schema:在 OpenAPI 的路径操作中,FastAPI 会为响应添加一个 JSON Schema,这有助于客户端理解响应结构。
  4. 文档生成:FastAPI 的自动文档系统会使用 response_model 来生成更准确的 API 文档。
简单的示例代码

简单的输出响应类

from fastapi import FastAPI
from pydantic import BaseModelapp = FastAPI()class Item(BaseModel):name: strdescription: str = Noneprice: floattax: float = None@app.get("/items/{item_id}", response_model=Item)
async def read_item(item_id: int):return {"name": "Item Name", "price": 10.5, "tax": 1.5}

在这个示例中,我们定义了一个 Item 模型,并在路由中使用 response_model=Item 来声明响应模型。这样,FastAPI 会自动处理响应数据的序列化和验证。

常见示例代码

将 ApiResponse 作为 response_model 并加入 token 验证的功能,一般用于登录和验证输出结果

from fastapi import FastAPI, Depends, HTTPException, Header
from pydantic import BaseModelapp = FastAPI()# 定义用户模型
class User(BaseModel):user_id: intname: strsex: int# 定义响应模型,包含嵌套的用户模型
class ApiResponse(BaseModel):status: strcode: intdata: User# 创建一个依赖项,用于获取请求头中的 token
def get_token(token: str = Header(None)):if token != "correct-token":raise HTTPException(status_code=401, detail="Invalid or missing token")return token# 创建一个路由,使用 ApiResponse 作为响应模型,并获取 token
@app.get("/user", response_model=ApiResponse)
async def get_user(token: str = Depends(get_token)):# 这里可以根据 token 进行一些逻辑处理,例如验证 token 并获取用户信息# 为了示例,我们直接返回一个固定的用户信息return ApiResponse(status="success",code=0,data=User(user_id=100, name="sdw", sex=0))# 运行应用
if __name__ == "__main__":import uvicornuvicorn.run(app, host="0.0.0.0", port=8000)

在这个示例中,我们做了以下修改:

  1. 定义模型:定义了 UserApiResponse 模型。
  2. 创建依赖项get_token 函数用于从请求头中获取 token 并进行验证。如果 token 不正确,抛出 HTTPException
  3. 使用 response_model:在 get_user 路由中,我们使用 response_model=ApiResponse 来指定响应模型。
  4. 处理请求:在 get_user 路由中,我们注入 get_token 依赖项,并返回一个 ApiResponse 实例。

要测试这个路由,你可以使用工具如 curl 或 Postman 发送一个带有正确 token 的 GET 请求:

curl -H "Authorization: Bearer correct-token" http://localhost:8000/user

这将返回预期的 JSON 响应。如果 token 不正确,将返回一个 401 错误。注意,我们将 token 放在 Authorization 请求头中,这是一种常见的做法。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • linux学习之线程2:线程控制与使用
  • 一例pyinstaller打包的cs马鉴赏
  • SprinBoot+Vue校园车辆管理系统的设计与实现
  • (Java企业 / 公司项目)点赞业务系统设计-批量查询点赞状态(二)
  • 【区块链 + 人才服务】Blockchain Workshop- 区块链编程实践平台 | FISCO BCOS应用案例
  • vue3使用leaflet+trackplayer实现非地图动画轨迹(市场平面图动态轨迹)
  • 汇编语言第一次作业
  • Unity:类塔科夫,塔防网格构建
  • Agent、RAG、LangChain的概念及作用
  • spring security 如何解决跨域的
  • js部分面试题
  • 如何通过可视化大屏,打通智慧城市建设的“最后一公里”?
  • crontab命令:定时任务,周期执行
  • ROS2仿真之两轮差速
  • 纵切车床和走心机的区别
  • angular组件开发
  • css系列之关于字体的事
  • Docker: 容器互访的三种方式
  • IndexedDB
  • Iterator 和 for...of 循环
  • Kibana配置logstash,报表一体化
  • leetcode46 Permutation 排列组合
  • rc-form之最单纯情况
  • react-native 安卓真机环境搭建
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 动态魔术使用DBMS_SQL
  • 机器学习中为什么要做归一化normalization
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 将 Measurements 和 Units 应用到物理学
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • 思维导图—你不知道的JavaScript中卷
  • 写代码的正确姿势
  • 做一名精致的JavaScripter 01:JavaScript简介
  • 说说我为什么看好Spring Cloud Alibaba
  • ​DB-Engines 12月数据库排名: PostgreSQL有望获得「2020年度数据库」荣誉?
  • ​补​充​经​纬​恒​润​一​面​
  • ​业务双活的数据切换思路设计(下)
  • #Z0458. 树的中心2
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • (1)Nginx简介和安装教程
  • (1)svelte 教程:hello world
  • (Windows环境)FFMPEG编译,包含编译x264以及x265
  • (附源码)springboot家庭财务分析系统 毕业设计641323
  • (论文阅读26/100)Weakly-supervised learning with convolutional neural networks
  • (一)认识微服务
  • (转载)在C#用WM_COPYDATA消息来实现两个进程之间传递数据
  • .[backups@airmail.cc].faust勒索病毒的最新威胁:如何恢复您的数据?
  • .gitattributes 文件
  • .NET 中小心嵌套等待的 Task,它可能会耗尽你线程池的现有资源,出现类似死锁的情况
  • .NET3.5下用Lambda简化跨线程访问窗体控件,避免繁复的delegate,Invoke(转)
  • .NET6 开发一个检查某些状态持续多长时间的类
  • .net使用excel的cells对象没有value方法——学习.net的Excel工作表问题
  • .考试倒计时43天!来提分啦!