FastAPI请求体-多个参数

路径参数、查询参数,和请求体混合

首先,我们需要导入所需的库。我们将使用FastAPI、Path和Annotated来处理路由和参数,并使用BaseModel和Union来自定义数据模型。

完整示例代码

from typing import Annotated, Unionfrom fastapi import FastAPI, Path
from pydantic import BaseModelapp = FastAPI()class Book(BaseModel):title: strauthor: Union[str, None] = Nonepages: int@app.put("/books/{book_id}")
async def update_book(book_id: Annotated[int, Path(title="The ID of the book to get", ge=0, le=1000)],q: Union[str, None] = None,book: Union[Book, None] = None,
):results = {"book_id": book_id}if q:results.update({"q": q})if book:results.update({"book": book})return results

代码分析

class Book(BaseModel):title: strauthor: Union[str, None] = Nonepages: int

定义一个自定义的数据模型类。在这个例子中,我们将创建一个名为Book的类,它包含以下字段:title(字符串)、author(字符串,可选)和pages(整数):

接下来,我们定义一个带有查询参数和路径参数的路由。这个路由将用于更新一本书的信息:

@app.put("/books/{book_id}")
async def update_book(book_id: Annotated[int, Path(title="The ID of the book to get", ge=0, le=1000)],q: Union[str, None] = None,book: Union[Book, None] = None,
):results = {"book_id": book_id}if q:results.update({"q": q})if book:results.update({"book": book})return results

在这个例子中,我们定义了一个PUT请求的路由,其路径为"/books/{book_id}"。我们使用了Path对象来指定路径参数book_id的约束条件:大于等于0且小于等于1000。

我们还添加了一个名为q的查询参数,它可以是字符串或None。

最后,我们添加了一个名为book的参数,它可以是一个Book对象或None。这个参数允许用户在请求体中传递书籍的详细信息。

打开自动化测试文档,我们可以看到如下内容
在这里插入图片描述
发起请求进行测试
在这里插入图片描述

总结

通过使用FastAPI、Path和Annotated,你可以轻松地定义具有复杂参数的路由。同时,使用Pydantic的BaseModel可以让你更方便地定义数据模型并自动进行数据验证。

多个请求体

完整示例代码

from typing import Unionfrom fastapi import FastAPI, Body
from pydantic import BaseModelclass Product(BaseModel):name: strdescription: Union[str, None] = Noneprice: floattax: Union[float, None] = Noneclass Customer(BaseModel):username: strfull_name: Union[str, None] = Noneapp = FastAPI()@app.put("/products/{product_id}")
async def update_product(product_id: int, product: Product = Body(...), customer: Customer = Body(...)):results = {"product_id": product_id, "product": product, "customer": customer}return results

这段代码定义了一个FastAPI应用,该应用可以处理一个PUT请求,这个请求包含了商品信息和客户信息。下面是对这段代码的详细解释。

首先,我们导入了所需的库:

from typing import Unionfrom fastapi import FastAPI, Body
from pydantic import BaseModel

然后,我们定义了两个模型类:Product和Customer:

class Product(BaseModel):name: strdescription: Union[str, None] = Noneprice: floattax: Union[float, None] = Noneclass Customer(BaseModel):username: strfull_name: Union[str, None] = None

这两个类分别代表商品和客户。它们都是BaseModel的子类,这意味着它们可以被用于解析JSON数据。

接下来,我们创建了一个FastAPI应用实例:

app = FastAPI()

最后,我们编写了一个路由处理器函数:update_product:

@app.put("/products/{product_id}")
async def update_product(product_id: int, product: Product = Body(...), customer: Customer = Body(...)):results = {"product_id": product_id, "product": product, "customer": customer}return results

这个函数接收三个参数:商品ID、商品和客户。其中,商品和客户是通过Body装饰器从请求体中获取的。当客户端发起PUT请求到"/products/{product_id}"时,FastAPI会自动将请求体中的JSON数据转换为Product和Customer对象。

嵌套参数

from typing import Annotated, Unionfrom fastapi import Body, FastAPI
from pydantic import BaseModelapp = FastAPI()class Book(BaseModel):name: strdescription: Union[str, None] = Noneprice: floattax: Union[float, None] = None@app.put("/books/{book_id}")
async def update_book(book_id: int, book: Annotated[Book, Body(embed=True)]):results = {"book_id": book_id, "book": book}return results

效果
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/263684.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【开源】基于JAVA语言的数字化社区网格管理系统

项目编号: S 042 ,文末获取源码。 \color{red}{项目编号:S042,文末获取源码。} 项目编号:S042,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、开发背景四、系统展示五、核心源码5…

【工具】JS|浏览器脚本6分钟极速入门 · 开发一个限制自己刷b站的脚本

这张图花里胡哨的是让AI生成的,我觉得怪可爱的,就直接作为封面了。 这篇文章中会开发一个JS脚本,这是一个用来限制b站网页版功能的脚本,避免刷b站的时间过长。功能如下: 除了搜索、视频页、私信页之外的任何页都会被重…

[每周一更]-(第76期):Go源码阅读与分析的方式

读源码可以深层理解Go的编写方式,理解作者们的思维方式;也有助于对Go语法用法深刻的理解,我们从这一篇说一下如何读源码,从哪些源码着手,从 简单到深入的方式学习源码; 学习源码也是一个修炼过程&#xff0…

windows下 Tomcat启动黑框隐藏

进入到 tomcat/bin 目录下,找到此文件 setclasspath.bat ,右键文本打开 找到此属性 : set _RUNJAVA"%JRE_HOME%\bin\java.exe"修改成以下属性,保存文件,重启启动tomcat会发现黑框不默认弹出了: …

@德人合科技 | 数据透明加密防泄密系统\文件文档加密\设计图纸加密|源代码加密防泄密软件系统,——防止内部办公终端核心文件数据/资料外泄!

一款专业的数据防泄密管理系统,它采用了多种加密模式,包括透明加密、半透明加密和落地加密等,可以有效地保护企业的核心数据安全。 PC端访问地址: https://isite.baidu.com/site/wjz012xr/2eae091d-1b97-4276-90bc-6757c5dfedee …

C++设计模式——Adapter(适配器)模式

一、Adapter模式是个啥? 适配器模式在软件开发的江湖里,可以说用途是非常广的。下面几个经典的场景来说明适配器模式的使用。 场景一 场景二 假如你正在开发一款股票市场监测程序, 它会从不同来源下载 XML 格式的股票数据, 然后…

[香橙派]orange pi zero 3 烧录Ubuntu系统镜像——无需HDMI数据线安装

一、前言 本文我们将介绍如何使用orange pi zero 3 安装Ubuntu系统,本文相关步骤均参考自开发手册。 二、实施准备 根据开发手册中所提到的,我们应该拥有如下配件: 1.orange pi zero 3 开发板 2.TF 卡——最小 8GB 容量的 class10 级或以上的高速闪迪卡。…

uniApp项目的创建,运行到小程序

一、项目创建 1. 打开 HBuilder X 2. 右击侧边栏点击新建,选择项目 3. 填写项目名,点击创建即可 注:uniapp中如果使用生命周期钩子函数,建议使用哪种 ?(建议使用Vue的) 二、运行 1. 运行前先登录 2. 登录后点击 manifest.js…

【数据结构 — 排序 — 选择排序】

数据结构 — 排序 — 选择排序 一.选择排序1.基本思想2.直接选择排序2.1算法讲解2.2.代码实现2.2.1.函数定义2.2.2.算法接口实现2.2.3.测试代码实现2.2.4.测试展示 3.堆排序3.1.算法讲解3.2.代码实现3.2.1.函数定义3.2.2.算法接口实现3.2.3.测试代码实现3.2.4.测试展示 一.选择…

笔记69:Conv1d 和 Conv2d 之间的区别

笔记地址:D:\work_file\(4)DeepLearning_Learning\03_个人笔记\4. Transformer 网络变体 a a a a a a a a a a a

二百一十、Hive——Flume采集的JSON数据文件写入Hive的ODS层表后字段的数据残缺

一、目的 在用Flume把Kafka的数据采集写入Hive的ODS层表的HDFS文件路径后,发现HDFS文件中没问题,但是ODS层表中字段的数据却有问题,字段中的JSON数据不全 二、Hive处理JSON数据方式 (一)将Flume采集Kafka的JSON数据…

Java IO流(五)(字符集基础知识简介)

字符集 计算机的存储规则(英文字符) 常见字符集介绍 a.GB2312字符集:1980年发布,1981年5月1日实施的简体中文汉字编码国家标准。收录7445个图形字符,其中包括6763个简体汉字 b.BIG5字符集:台湾地区繁体中…