FastAPI请求体-多个参数

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

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

完整示例代码

from typing import Annotated, Union

from fastapi import FastAPI, Path
from pydantic import BaseModel

app = FastAPI()


class Book(BaseModel):
    title: str
    author: Union[str, None] = None
    pages: 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: str
    author: Union[str, None] = None
    pages: 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 Union

from fastapi import FastAPI, Body
from pydantic import BaseModel


class Product(BaseModel):
    name: str
    description: Union[str, None] = None
    price: float
    tax: Union[float, None] = None


class Customer(BaseModel):
    username: str
    full_name: Union[str, None] = None


app = 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 Union

from fastapi import FastAPI, Body
from pydantic import BaseModel

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

class Product(BaseModel):
    name: str
    description: Union[str, None] = None
    price: float
    tax: Union[float, None] = None


class Customer(BaseModel):
    username: str
    full_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, Union

from fastapi import Body, FastAPI
from pydantic import BaseModel

app = FastAPI()


class Book(BaseModel):
    name: str
    description: Union[str, None] = None
    price: float
    tax: 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

效果
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

开源好用EasyImages简单图床源码

源码介绍 开源好用EasyImages简单图床源码分享,虽然它是开源程序,但功能一点也不弱,不仅支持多文件上传、文字/图片水印、支持API和鉴黄、还能自定义代码,最重要的是它不强制使用数据库运行,这就给我们的部署和维护带…

算法训练营Day7

语言 采用的Java语言,一些分析也是用于Java,请注意。 454.四数相加II 454. 四数相加 II - 力扣(LeetCode) 这道题理解好只是统计数量即可,不需要去重,因此很简单的题目。 class Solution {public int fou…

SSD基础架构与NAND IO并发问题探讨

在我们的日常生活中,我们经常会遇到一些“快如闪电”的事物:比如那场突如其来的雨、那个突然出现在你眼前的前任、还有就是今天我们要聊的——固态硬盘(SSD)。 如果你是一个技术宅,或者对速度有着近乎偏执的追求&…

深度学习——第4.1章 深度学习的数学基础

第4章 深度学习的数学基础 目录 4.1 向量 4.2 求和符号 4.3 累乘符号 4.4 导数 4.5 偏导数 4.6 矩阵 4.7 指数函数和对数函数 注意:4.6和4.7位于4.2章 第4章 深度学习的数学基础 本章总结一下机器学习所需的数学知识,同时介绍如何在Python中使用…

Kafka 最佳实践:构建可靠、高性能的分布式消息系统

Apache Kafka 是一个强大的分布式消息系统,被广泛应用于实时数据流处理和事件驱动架构。为了充分发挥 Kafka 的优势,需要遵循一些最佳实践,确保系统在高负载下稳定运行,数据可靠传递。本文将深入探讨 Kafka 的一些最佳实践&#x…

二叉排序树的判断(二叉树的顺序存储):2022年408算法题

对于采用顺序存储方式保存的二叉树,根结点保存在SqBiTNode[0]中;当某结点保存SqBiTNode[i]中时,若有左孩子,则其值保存在SqBiTNode [2i1]中;若有右孩子,则其值保存在SqBiTNode[2i2]中;若有双亲结…

JavaScript中冷门但有用的String.raw

文章梗概 本文讲解的String.raw,作为JavaScript中的静态方法,用来获取模板字符串的原始字符串形式,需要注意的是与字符串模板搭配时候的事项。 介绍 String.raw() 静态方法是模板字符串的标签函数。它的作用类似于 Python 中的 r 前缀或 C#…

linux7安装python3.12.1教程

1.下载tar.gz包 地址:Python Release Python 3.12.1 | Python.org 2.上传包到linux服并解压 cd /home/local/ ll tar -zxvf Python-3.12.1.tgz 3.安装编译python所需环境 yum install -y gcc yum install -y zlib* yum -y install zlib-devel bzip2-devel opens…

组件之间传值

目录 1:组件中的关系 2:父向子传值 3:子组件向父组件共享数据 4:兄弟组件数据共享 1:组件中的关系 在项目中使用到的组件关系最常用两种是,父子关系,兄弟关系 例如A组件使用B组件或者C组件…

Windows 安全基础——Windows WPAD篇

Windows 安全基础——Windows WPAD篇 WPAD全称Web Proxy Auto-Discovery Protocol, 也就是Web代理自动发现协议。(这里的代理就是我们在渗透中使用BURP的时候修改的代理设置。)它的作用是让局域网浏览器自动发现内网中的代理服务器&#xff…

java接入gpt开发

前情提要 本次文章使用编译器为IDEA2020 使用GPT模型为百度旗下的千帆大模型 如果是个人用或者不流传出去,可以无脑入,因为会免费送20块钱(够用上万次) 代金卷查看 正式教程: 百度智能云控制台 (baidu.com) 按照步…

c++-定长内存池

文章目录 前言一、定长内存池 前言 一、定长内存池 我们知道申请内存使用的是malloc,malloc其实就是一个通用的申请函数,什么场景下都可以用,但是什么场景下都可以用就意味着什么场景下都不会有很高的性能,下面我们来设计一个定…

Diffusion Models: A Comprehensive Survey of Methods and Applications

摘要 扩散模型作为一个强大的新的深度生成模型系列出现,在许多应用中具有破纪录的性能,包括图像合成、视频生成和分子设计。在这项调查中,我们对迅速扩大的扩散模型的工作进行了概述,将研究分为三个关键领域:有效采样…

HCIP —— BGP 基础 (下)

BGP 的状态机 --- 建立对等体之间的TCP会话:指定建立对等体的对象 六种状态机 Idle状态 Idle 等待状态(相当于OSPF的down状态)--- 采用TCP单播建邻 Idle 状态下,启动BGP协议后必须指定建立对等体的目标之后,才能进入…

python中getattr

一、getattr的基本概念 getattr是python的一个内置函数,说白了也很简单,就是判断一个方法或者属性是否存在于一个对象中若是存在则运行这个属性或者方法。 getattr(object, name[, default])object:对象名称 name:属性或者方法名…

uniappp框架——初始化vue3项目(搭建ai项目第一步)

文章目录 ⭐前言💖 小程序系列文章 ⭐uniapp创建项目💖 初始化项目💖 uni实例生命周期💖 组件生命周期💖 页面调用💖 页面通讯💖 路由 ⭐搭建首页⭐form表单校验页面⭐总结⭐结束 ⭐前言 大家好…

6.题目:编号2490 小蓝的括号串1

题目: ### 这道题主要考察stack #include<bits/stdc.h> using namespace std; const int N105; stack<char> stk; char s[N]; int main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);int n;cin>>n;cin>>s1;bool anstrue;for(int i1;i<n;i){…

Verilog基础:$random系统函数的使用

相关阅读 Verilog基础​编辑https://blog.csdn.net/weixin_45791458/category_12263729.html $random系统函数语法的BNF范式如下所示&#xff0c;有关BNF范式相关内容&#xff0c;可以浏览以往文章Verilog基础&#xff1a;巴科斯范式(BNF)。 $random系统函数在每次调用时返回一…

第四节JavaScript 条件语句、循环语句、break与continue语句

一、JavaScript条件语句 在通常的代码中&#xff0c;我们有一些需要决定执行不同动作&#xff0c;这就可以在代码中使用条件语句来完成。 下面是我们常使用的条件语句&#xff1a; if语句&#xff1a;只有当指定条件是true时&#xff0c;执行条件内代码。if…else语句&#…

【Unity动画】什么是任意状态(Any state)

&#xff08;Any state&#xff09;可以从某个状态A直接切换到另一个状态 B\C\D\E\F 比如A到C的过渡&#xff0c;直接设置从Any state 到C的过渡线触发参数即可。而不需要让A到C直接在连接&#xff0c;同样&#xff0c;B到C之间也无需直接链接。 这样设计是在每一个动画之间都…