fastapi-参数

news2024/11/26 5:57:13

路径参数

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

from fastapi import FastAPI

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

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

class 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 FastAPI

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

class Item(BaseModel):
    name: str
    description: str|None = None
    price: float
    tax: float|None = None
    
@app.post("/items/")
async def create_item(item: Item):
    return item

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

pPvJsKK.png

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

关于电容充放电

计算下电容放电时,其电压和时间的关系 百度:电容充放电电压公式 电容充放电时间 百度安全验证https://baijiahao.baidu.com/s?id1618374634281434486&wfrspider&forpc 电容充电放电时间计算公式: 设,V0 为电容上的初始…

双十一有哪些值得买的东西?2023年双十一运动好物强烈推荐

看着日历上的双十一正在一步一步的向我们挥手,同时也能感受到各大电商平台的预热活动,我们很清楚的知道双十一快要到来了,这也意味着一年一度疯狂扫货的日子也快到了,那么在今年双十一有哪些值得买的东西?作为一个玩转…

自动驾驶算法(三):RRT算法讲解与代码实现(基于采样的路径规划)

目录 1 RRT算法原理 2 RRT算法代码解析 3 RRT完整代码 1 RRT算法原理 RRT算法的全称是快速扩展随机树算法(Rapidly Exploring Random Tree),它的想法就是从根结点长出一棵树当树枝长到终点的时候这样就能找到从终点到根节点的唯一路径。 算法流程: 首先…

Jorani远程命令执行漏洞 CVE-2023-26469

Jorani远程命令执行漏洞 CVE-2023-26469 漏洞描述漏洞影响漏洞危害网络测绘Fofa: title"Jorani"Hunter: web.title"Jorani" 漏洞复现1. 获取cookie2. 构造poc3. 执行命令 漏洞描述 Jorani是一款开源的员工考勤和休假管理系统,适用于中小型企业…

网络安全(黑客)小白自学

1.网络安全是什么 网络安全可以基于攻击和防御视角来分类,我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术,而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 2.网络安全市场 一、是市场需求量高; 二、则是发展相对成熟入…

Vue2实现别踩白块(第一种)

实际效果:可选模式 开始按钮 游戏界面 游戏失败(不点击任何黑块) 游戏中(点击黑块变灰色) 功能简介: 1、点击无尽模式,就是常规速度,定时器20毫秒,然后无限计分 2、急速模式,比常规快一倍,定时器8毫秒 3、计时模式,限时60秒,定时器20毫秒,计分 以上所有模式,点击…

OpenLayers实战,OpenLayers结合下拉菜单实现城市切换,动态切换城市边界到地图视图视角范围内

专栏目录: OpenLayers实战进阶专栏目录 前言 本章是OpenLayers综合实战案例,使用OpenLayers结合下拉菜单实现城市切换,动态切换城市边界到地图视图视角范围内。 本章需要使用到ElementUI的下拉框组件和OpenLayers的TopoJson格式解析地市边界数据并负责渲染,通过动态创建s…

实施ERP系统和实施MES管理系统哪个更难

在企业管理软件的领域中,ERP管理系统和MES生产管理系统是两种常见且关键的系统。它们在实施过程中都会面临各种挑战,但对于哪个更具挑战性,人们意见纷纭。实际上,这两种系统的实施难度取决于组织的特定情境和需求。 ERP系统的实施…

性能测试计划注意事项

在做任何事情之前,唯有进行了良好的计划,方可收到好的效果,性能测试 也是如此,一份定义明确的测试计划将为我们的测试提供良好的保证。下面和大 家讨论一下制定性能测试计划时的一些注意事项。 1. 分析应用程序 测试人员应当对系统的软硬件以及配置情况非常熟悉,这样模…

全志R128应用开发案例——适配SPI驱动ST7789V2.4寸LCD

SPI驱动ST7789V1.47寸LCD R128 平台提供了 SPI DBI 的 SPI TFT 接口,具有如下特点: Supports DBI Type C 3 Line/4 Line Interface ModeSupports 2 Data Lane Interface ModeSupports data source from CPU or DMASupports RGB111/444/565/666/888 vid…

复旦教授如何看待人工智能的出现?一句话:科技应该造福人类!

原创 | 文 BFT机器人 01 引言 今年5月1日当天,第一波AI失业潮到来。科技巨头IBM公司宣布暂停7800人的招聘,这些人的工作岗位将由AI取代。 此前3月底,高盛集团发布报告,预计全球将有3亿个工作岗位会被生成式AI取代,其…

SSL证书买赠活动

作为JoySSL致力于提供卓越网络安全解决方案的举措之一,SSL证书买赠活动正式上线。购买两年证书,额外赠送一年;购买三年证书,额外赠送两年;最高支持买五年赠送五年。 同时还提供快速、简单的SSL证书申请部署流程&#x…

摩托车商家做展示预约小程序的作用

摩托车与电动车是人们短距离出行的主要工具,而其使用寿命一般是3年左右及以上、一家可能有多个,市场人群庞大且复购属性强,所以其经营商家也非常多。 如今互联网深入,在品牌宣传、客户获取、信息承载、营销等方面需要车辆经营商家…

ToF 测距传感器 VL6180 使用踩坑记

VL6180 使用坎坷过程 ...... by 矜辰所致前言 最近项目上用到一款测距传感器 VL6180 ,实际网上资料已经很多了,而且都有现成的 Demo ,甚至拿来直接用都可以,实际上在使用 STM32 芯片做测试的时候,参考网上的现成例程…

有多个网站的话申请什么样的SSL证书比较好?

在当今互联网时代,许多组织和个人都需要同时管理多个网站,这可能包括公司内部网站、在线商店、博客等。为了确保这些网站的安全性和数据保护,选择适合管理多个网站的SSL证书至关重要。今天小编就为大家详细介绍下,不同情况下多个网…

linux远程桌面管理工具xrdp

一、概述 我们知道,我们日常通过vnc来远程管理linux图形界面,今天分享一工具Xrdp,它是一个开源工具,允许用户通过Windows RDP访问Linux远程桌面。 除了Windows RDP之外,xrdp工具还接受来自其他RDP客户端的连接&#xf…

720VR全景视觉源码系统+一键生成网络三维实景 带完整的搭建教程

720VR全景视觉源码系统是一种基于HTML5和VR技术开发的源码系统,通过该系统,用户可以轻松创建具有高度真实感的3D实景体验。该系统具有易用性、可定制性以及高度可扩展性等特点,能够满足不同类型用户的视觉需求。借助720VR全景视觉源码系统&am…

欧科云链研究院:如何降低Web3风险,提升虚拟资产创新的安全合规

在香港Web3.0行业,技术推动了虚拟资产投资市场的快速增长,但另一方面,JPEX诈骗案等行业风险事件也接连发生,为Web3行业发展提供了重要警示。在近期的香港立法会施政报告答问会上,行政长官李家超表示,与诈骗…

Problem J. Prime Game--2018南京ICPC

解析&#xff1a; 分解每一个数&#xff0c;并且记录其前面相同素因子的位置&#xff0c;然后每次加上这段距离乘后面一直到结尾的距离。 #include<bits/stdc.h> using namespace std; const int N1e65; int n,a[N]; int t[N],idx; int pre[N]; void func(int x){idx0;f…

计算样本方差和总体方差

例如&#xff0c;给出了三个数据&#xff0c;194、183、175&#xff0c;现在计算样本方差和总体方差。 手工计算 它们的平均值 样本方差 总体方差 用excel计算 样本方差 总体方差