fastapi-参数

路径参数

你可以使用与 Python 格式化字符串相同的语法来声明路径"参数"或"变量":

from fastapi import FastAPIapp = FastAPI()@app.get("/items/{item_id}")
async def item_details(item_id: int):return {"item_id": item_id}

路径参数item_id的值将作为参数item_id传递给你的函数。在Swagger UI中的表现如下:

pPvGYtA.png

然后,我们可以访问http://127.0.0.1:8000/items/1,将会看到如下响应:

{"item_id": 1
}

另外,fastapi还具有一个数据校验的功能,如果你通过浏览器访问http://127.0.0.1:8000/items/foo,你会看到一个清晰可读的422 HTTP错误,如下:

{"detail": [{"loc": ["path","item_id"],"msg": "value is not a valid integer","type": "type_error.integer"}]
}

因为路径参数item_id传入的值为 “foo”,它不是一个int,如果你提供的是float而非整数也会出现同样的错误!

假设,有如下例子:


@app.get("/items/me")
async def items_me():pass@app.get("/items/{user_id}")
async def items_details(user_id):pass

当我们访问http://127.0.0.1:8000/items/me时,我们会发生永远都是走的第一个路由,这是因为路由操作是按顺序依次运行的。如果将@app.route("/items/{user_id}")写在前面,那么/items/{user_id}的路径还将与/items/me相匹配,认为自己正在接收一个值为“me”的user_id参数!

fastapi还支持使用Enum来创建具有固定值的类属性参数,如下:

from enum import Enum
from fastapi import FastAPIapp = FastAPI()class EnumParams(str, Enum):Man = "man"Woman = "woman"@app.get("/people/{sex}")
async def people(sex: EnumParams):return {"sex": sex}

当传递的位置参数不是EnumParams设置的值时,将会校验不通过!

假设你有一个路径操作,它的路径为/files/{file_path},但是你需要file_path自身也包含路径,比如/home/johndoe/myfile.txt。因此,该文件的URL将类似于这样:/files/home/johndoe/myfile.txt

@app.get("/files/{path}")
async def people(path: str):return {"path": path}

当我们访问localhost:8000/files/home/johndoe/myfile.txt时,并不能如愿,而是返回了一个错误!这是因为不支持任何方式去声明路径参数以在其内部包含路径,因为这可能会导致难以测试和定义的情况出现。

不过,我们仍可以使用其他方式来实现它,如下:

@app.get("/files/{path: path}")
async def people(path: str):return {"path": path}

当校验url非为path时,且没有其他路由与之匹配,那么将会返回404错误!

除了path关键字之外,其他常用的定义类型的关键字如下:

  • str: 表示参数为字符串
  • int: 表示参数为整型数字
  • float: 表示参数为浮点型数字
  • uuid: 表示参数为uuid

除了这些常用的关键字之外,我们还可以进行自定义。使用如下:

from fastapi import FastAPI
from starlette.convertors import Convertor
from starlette.convertors import register_url_convertorclass CustomConvertor(Convertor):regex = "[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}"def convert(self, value: str) -> str:return str(value)def to_string(self, value: str) -> str:return str(value)app = FastAPI()
register_url_convertor('custom', CustomConvertor())@app.get("/items/{item_id:custom}")
async def item_details(item_id: str):return {"item_id": item_id}

值得注意的是,在方法中定义的参数类型,需要与Convertorconvert方法返回的类型一致,否则将会引发422错误!!!

查询参数

声明不属于路径参数的其他函数参数时,它们将被自动解释为"查询字符串"参数

from fastapi import FastAPIapp = FastAPI()
data = [{"name": "zhangsan", "age": 1}, {"name": "lisi", "age": 2}]@app.get("/people")
async def people(offset: int, limit: int):return data[offset: offset+limit]

在Swagger UI中的表现形式如下:

pPvJuNj.png

查询字符串是键值对的集合,这些键值对位于URL?之后,并以&符号分隔。当我们访问http://localhost:8000/people?offset=0&limit=1时,则会将offset与limit传递到对应的参数里边!

另外还可以对参数设置默认值,如下:

@app.get("/people")
async def people(offset: int, limit: int = 20):return data[offset: offset+limit]

则当请求的url中未携带limit参数时,将默认为limit为20!

此外,我们还可以声明bool类型的参数,他们将被自动转换,如下:

@app.get("/people")
async def people(is_woman: bool):return {"woman": is_woman}

当我们访问如下url时,都将会把参数的值自动转换为True

http://localhost:8000/people?is_woman=1
http://localhost:8000/people?is_woman=True
http://localhost:8000/people?is_woman=true
http://localhost:8000/people?is_woman=yes
http://localhost:8000/people?is_woman=on

当路径参数和查询参数同时存在时,如下:

@app.get("/people/{id}")
async def people(id: int, is_woman: bool):return {"woman": is_woman}

可同时存在多个路径参数和查询参数,并且不需要以任何特定的顺序来声明!

有的时候,我们可能会需要接收一个List的数据,就像这样:http://localhost:8000/users?id=1&id=2,在FastAPI中,我们可以这么定义,如下:

@app.get("/users")
async def user_list(id: List[int]):pass

请求体参数

当你需要将数据从客户端(例如浏览器)发送给API时,你将其作为「请求体」发送。请求体是客户端发送给API的数据。响应体是API发送给客户端的数据。你的API几乎总是要发送响应体。但是客户端并不总是需要发送请求体。我们使用Pydantic模型来声明请求体,并能够获得它们所具有的所有能力和优点。安装如下:

pip install pydantic

然后在对其进行导入,使用如下:

from pydantic import BaseModelclass Item(BaseModel):name: strdescription: str|None = Noneprice: floattax: float|None = None@app.post("/items/")
async def create_item(item: Item):return item

在Swagger UI中的表现形式如下:

pPvJsKK.png

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

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

相关文章

竖版视频怎么做二维码?扫码播放竖版视频的方法

当我们在将视频转二维码图片展示的时候,一般横版视频在手机展示不会有影响,但是竖版视频会默认用横版的方式播放就会导致无法清晰的看到画面的内容,那么如何将竖版视频生成二维码是很多小伙伴头疼的一个问题。那么下面教大家使用二维码生成器…

Android 如何在Android studio中快速创建raw和assets文件夹

一 方案 1. 创建raw文件夹 切成project浏览模式——>找到res文件粘贴要放入raw文件夹下的文件。 当然此时raw文件还没有,直接在右侧输入框中出现的路径~\res后面加上\raw即可。 2. 创建assets文件夹 同理在main文件夹下粘贴要放入assets文件夹的文件&#xff0…

Java精品项目62基于Springboot+Vue实现的大学生在线答疑平台(编号V62)

Java精品项目62基于SpringbootVue实现的大学生在线答疑平台(编号V62) 大家好,小辰今天给大家介绍一个基于SpringbootVue实现的大学生在线答疑平台(编号V62),演示视频公众号(小辰哥的Java)对号查询观看即可 文章目录 Java精品项目…

云尘-Node1 js代码

继续做题 拿到就是基本扫一下 nmap -sP 172.25.0.0/24 nmap -sV -sS -p- -v 172.25.0.13 然后顺便fscan扫一下咯 nmap: fscan: 还以为直接getshell了 老演员了 其实只是302跳转 所以我们无视 只有一个站 直接看就行了 扫出来了两个目录 但是没办法 都是要跳转 说明还是需要…

tomcat必要的配置

tomcat要配置两个,不然访问不了localhost:8080 名:CATALINA_HOME 值:D:\software\computer_software\Tomcat\tomcat8.5.66

taro全局配置页面路由和tabBar页面跳转

有能力可以看官方文档:Taro 文档 页面路由配置,配置在app.config.ts里面的pages里: window用于设置小程序的状态栏、导航条、标题、窗口背景色,其配置项如下: tabBar配置:如果小程序是一个多 tab 应用&…

你一般会什么时候使用CHATGPT?

在当今数字时代,人们对于人工智能(AI)的依赖程度日益增加,而ChatGPT作为一种强大的自然语言处理工具,吸引了人们的广泛关注和应用。那么,人一般在什么时候会想要使用ChatGPT呢?这个问题涵盖了多…

【原创】java+swing+mysql志愿者管理系统设计与实现

摘要: 志愿者管理系统是一个用于管理志愿者以及活动报名的系统,提高志愿者管理的效率,同时为志愿者提供更好的服务和体验。本文主要介绍如何使用javaswingmysql去实现一个志愿者管理系统。 功能分析: 系统主要提供给管理员和志…

什么是块存储、文件存储、对象存储?

我们都知道,存储设备就是为数据提供空间。 U盘、硬盘和固态硬盘都是存储最终的存储设备。而块存储、文件存储和对象存储也可以简单地理解是不同类型的存储设备,它们是根据使用介质存储数据的手段或方法不同来划分的。 首先我们来看下块存储:…

160. 相交链表、Leetcode的Python实现

博客主页:🏆看看是李XX还是李歘歘 🏆 🌺每天分享一些包括但不限于计算机基础、算法等相关的知识点🌺 💗点关注不迷路,总有一些📖知识点📖是你想要的💗 ⛽️今…

Unity Perception合成数据生成、标注与ML模型训练

在线工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 3D场景编辑器 任何训练过机器学习模型的人都会告诉你,模型是从数据得到的,一般来说,更多的数据和标签会带来更好的性能。 …

垃圾分类箱通过工业4G路由器实现无人值守远程管理

据今年发布的相关数据统计,人们日常生活中每人每天至少能制造1.2kg垃圾,在环保事业中日常垃圾处理已经成为一项紧迫且不可忽视的任务。为了实现城市清洁和环境保护,越来越多的地区开始引入垃圾分类箱。传统的垃圾分类箱管理方式存在着一些不便…

【APP】go-musicfox - 一款网易云音乐命令行客户端, 文件很小Mac版本只有16.5M

go-musicfox 是用 Go 写的又一款网易云音乐命令行客户端,支持各种音质级别、UnblockNeteaseMusic、Last.fm、MPRIS 和 macOS 交互响应(睡眠暂停、蓝牙耳机连接断开响应和菜单栏控制等)等功能特性。 预览 启动 启动界面 主界面 主界面 通…

网络工程师-入门基础课:华为HCIA认证课程介绍

【微/信/公/众/号:厦门微思网络】 华为HCIA试听课程:超级实用,华为VRP系统文件详解 华为HCIA试听课程:不会传输层协议,HCIA都考不过 华为HCIA试听课程:网络工程师的基本功:网络地址转换NAT 一…

16. 机器学习 - 决策树

Hi,你好。我是茶桁。 在上一节课讲SVM之后,再给大家将一个新的分类模型「决策树」。我们直接开始正题。 决策树 我们从一个例子开始,来看下面这张图: 假设我们的x1 ~ x4是特征,y是最终的决定,打比方说是…

linux下mysql-8.2.0集群部署(python版本要在2.7以上)

目录 一、三台主机准备工作 1、mysql官方下载地址:https://dev.mysql.com/downloads/ 2、修改/etc/hosts 3、关闭防火墙 二、三台主机安装mysql-8.2.0 1、解压 2、下载相应配置 3、初始化mysql,启动myslq,设置开机自启 4、查看初始密…

华为云资源搭建过程

网络搭建 EIP: 弹性EIP,支持IPv4和IPv6。 弹性公网IP(Elastic IP)提供独立的公网IP资源,包括公网IP地址与公网出口带宽服务。可以与弹性云服务器、裸金属服务器、虚拟IP、弹性负载均衡、NAT网关等资源灵活地绑定及解绑…

学习python必会知识点:if条件判断语句的运用

大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 如果有什么疑惑/资料需要的可以点击文章末尾名片领取源码 if的基本格式 if语句用来做判断,并选择要执行的语句分支。 基本格式如下: if CONDITION1:code_block(1) elif CONDITION2:code_block(2) elif CO…

Spring Task(定时任务)框架

文章目录 一、Spring Task介绍二、cron表达式1.cron表达式介绍2.cron表达式在线生成器 三、fixedDelay四、fixedRate五、initialDelay六、Spring Task的使用1.导入maven坐标spring-context2.启动类添加注解EnableScheduling开启任务调度3.自定义定时任务类 一、Spring Task介绍…

机器人仿真-gazebo学习笔记(4)xacro和传感器添加

1.xacro简介 URDF文件不具备代码复用的特性(在上一篇文章也能发现,其实左右轮是极其相似的但还是要单独描述),一个复杂的机器人模型会拥有大量了的传感器和关节组件,这时候使用URDF文件就太难阅读了。精简化、可复用、…