首页 > 其他分享 >深入解析 FastAPI 查询参数:配置、类型转换与灵活组合

深入解析 FastAPI 查询参数:配置、类型转换与灵活组合

时间:2024-11-01 20:16:58浏览次数:3  
标签:类型转换 FastAPI item 参数 str skip 解析 id

深入解析 FastAPI 查询参数:配置、类型转换与灵活组合

本文全面解析了 FastAPI 查询参数的使用方法,包括配置默认值、设为可选或必选参数、类型转换以及组合使用等实用技巧。通过查询参数,开发者可以在路径操作函数中接收动态输入,灵活地构建 API 接口。文章详细说明了如何利用类型转换实现参数的自动解析和校验,同时展示了多个查询参数和路径参数组合使用的示例,为开发高效、灵活的 API 提供了可靠的指导。

文章目录

示例使用 Python 版本为 Python 3.10.15

一 简介

路径操作函数会把非路径参数自动解释为查询参数。示例:

from fastapi import FastAPI

app = FastAPI()

fake_items_db = [{"item_name": "Foo"}, {"item_name": "Bar"}, {"item_name": "Baz"}]


@app.get("/items/")
async def read_item(skip: int = 0, limit: int = 10):
    return fake_items_db[skip : skip + limit]

代码示例在 chapter03.py 中,运行如下命令:

$ uvicorn chapter03:app --reload

在线 SwaggerUI 文档,访问以下 URL :

http://127.0.0.1:8000/items/?skip=0&limit=10

查询参数为:

  • skip:值为 0
  • limit:值为 10

二 设置默认值

声明方法 async def read_item(skip: int = 0, limit: int = 10)skip=0limit=10 设定默认值。

访问 URL:

http://127.0.0.1:8000/items/

与访问以下地址相同:

http://127.0.0.1:8000/items/?skip=0&limit=10

但如果访问:

http://127.0.0.1:8000/items/?skip=20

查询参数的值就是:

  • skip=20:在 URL 中设定的值
  • limit=10:使用默认值

三 可选参数

默认值设为 None 时,查询参数为可选参数。

from fastapi import FastAPI

app = FastAPI()


@app.get("/items/{item_id}")
async def read_item(item_id: str, q: str | None = None):
    if q:
        return {"item_id": item_id, "q": q}
    return {"item_id": item_id}

本例中,查询参数 q 是可选的,默认值为 None

四 查询参数类型转换

参数还可以声明为 bool 类型,FastAPI 会自动转换参数类型:

from fastapi import FastAPI

app = FastAPI()


@app.get("/items02/{item_id}")
async def read_item(item_id: str, q: str | None = None, short: bool = False):
    item = {"item_id": item_id}
    # 如果 q 有值就更新
    if q:
        item.update({"q": q})
    if not short:
        item.update(
            {"description": "This is an amazing item that has a long description"}
        )
    return item

本例中,访问:

http://127.0.0.1:8000/items02/foo?short=1
http://127.0.0.1:8000/items02/foo?short=True
http://127.0.0.1:8000/items02/foo?short=true
http://127.0.0.1:8000/items02/foo?short=on
http://127.0.0.1:8000/items02/foo?short=yes

函数接收的 short 布尔类型参数都会自动转换。

五 多个路径和查询参数

from fastapi import FastAPI

app = FastAPI()


@app.get("/users/{user_id}/items/{item_id}")
async def read_user_item(
    user_id: int, item_id: str, q: str | None = None, short: bool = False
):
    item = {"item_id": item_id, "owner_id": user_id}
    if q:
        item.update({"q": q})
    if not short:
        item.update(
            {"description": "This is an amazing item that has a long description"}
        )
    return item

FastAPI 通过参数名进行检测,声明的查询参数的顺序并不重要。

六 必选查询参数

如果要把查询参数设置为必选,就不要设置默认值。在参数声明中设置默认值则该参数就不是必选参数。把参数设为可选,但又不想指定参数的默认值,则要把值设为 None

from fastapi import FastAPI

app = FastAPI()


@app.get("/items03/{item_id}")
async def read_user_item(item_id: str, needy: str):
    item = {"item_id": item_id, "needy": needy}
    return item

这里的查询参数 needy 是必选参数。访问 URL :

http://127.0.0.1:8000/items03/foo-item?needy=sooooneedy

响应返回 JSON:

{
    "item_id": "foo-item",
    "needy": "sooooneedy"
}

七 组合参数

from fastapi import FastAPI

app = FastAPI()


@app.get("/items04/{item_id}")
async def read_user_item(
        item_id: str, needy: str, skip: int = 0, limit: int | None = None
):
    item = {"item_id": item_id, "needy": needy, "skip": skip, "limit": limit}
    return item

本例中有 3 个查询参数和 1 个路径参数:

  • needy,必选的 str 类型参数
  • skip,默认值为 0int 类型参数
  • limit,可选的 int 类型参数
  • item_id,必选的 str 类型参数

八 完整代码示例

from fastapi import FastAPI

app = FastAPI()

fake_items_db = [{"item_name": "Foo"}, {"item_name": "Bar"}, {"item_name": "Baz"}]


@app.get("/items/")
async def read_item(skip: int = 0, limit: int = 10):
    return fake_items_db[skip: skip + limit]


@app.get("/items/{item_id}")
async def read_item(item_id: str, q: str | None = None):
    if q:
        return {"item_id": item_id, "q": q}
    return {"item_id": item_id}


@app.get("/items02/{item_id}")
async def read_item(item_id: str, q: str | None = None, short: bool = False):
    item = {"item_id": item_id}
    # 如果 q 有值就更新
    if q:
        item.update({"q": q})
    if not short:
        item.update(
            {"description": "This is an amazing item that has a long description"}
        )
    return item


@app.get("/users/{user_id}/items/{item_id}")
async def read_user_item(
        user_id: int, item_id: str, q: str | None = None, short: bool = False
):
    item = {"item_id": item_id, "owner_id": user_id}
    if q:
        item.update({"q": q})
    if not short:
        item.update(
            {"description": "This is an amazing item that has a long description"}
        )
    return item


@app.get("/items03/{item_id}")
async def read_user_item(item_id: str, needy: str):
    item = {"item_id": item_id, "needy": needy}
    return item


@app.get("/items04/{item_id}")
async def read_user_item(
        item_id: str, needy: str, skip: int = 0, limit: int | None = None
):
    item = {"item_id": item_id, "needy": needy, "skip": skip, "limit": limit}
    return item

九 源码地址

详情见:GitHub FastApiProj

引用: FastAPI 文档

标签:类型转换,FastAPI,item,参数,str,skip,解析,id
From: https://blog.csdn.net/u014394049/article/details/143438051

相关文章

  • ETLCloud怎么样?深度解析其在数据管理中的表现
    在BI或数据大屏等数据分析工具中,经常需要从多个业务系统中提取原始数据,然后对数据进行清洗、处理,以获取高质量、有效且干净的数据以供后续的BI进行数据统计和分析使用,从高质量的实现企业数据的价值变现。 然而,在实际操作中,我们常常面临着大量的数据质量问题,如数据缺失、重复、......
  • 遭遇gregn45.dll缺失?完整的应对gregn45.dll缺失修复指南全解析
    在使用电脑的过程中,有时会遇到应用程序或游戏提示“找不到gregn45.dll”或“gregn45.dll缺失”等错误消息。这通常意味着系统无法找到或加载这个关键的动态链接库(DLL)文件,导致相关应用程序或游戏无法正常运行。为了解决这个问题,以下是一份完整的应对gregn45.dll缺失的修复指南。......
  • js手写:防抖&节流 逐行代码解析
    差异分析刚开始写节流的时候,没有真正理解其难点,而且网上的防抖和节流函数,不得不说,真的是鱼龙混杂,有些看了简直添乱。    之前一直认为节流就是“时间间隔T内,点击一个按钮n次,只执行第1和n次”,完全没有体会到节流的难点其实在于多次相同的调用时传递的不同的!参数!防抖......
  • 批量下载文件的方法解析:为什么forEach不行,而for of却能成功?
    在日常开发中,我们经常需要处理批量下载文件的需求。本文将介绍一种批量下载文件的方法,并分析为什么在使用JavaScript进行批量操作时,forEach循环无法成功,而forof循环却能顺利完成。一、批量下载文件的方法在实现批量下载文件的功能时,我们可以采用以下步骤:获取需要下载的文......
  • 力扣题目解析--Z字形变换
    题目将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z字形排列。比如输入字符串为 "PAYPALISHIRING" 行数为 3 时,排列如下:PAHNAPLSIIGYIR之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"PAHNAPLSIIGYI......
  • Python制作视频解析全平台免费追剧神器
    importtkinter.messageboxasmsgboximporttkinterastkimportwebbrowserimportreimporturllib.parseclassAPP:def__init__(self,width=500,height=300):self.width=widthself.height=heightself.title='视频解析器&#......
  • 爆款解析:AI妖精变身视频火了,掌握这些就够了!附教程插件!
    近来我想很多人在各大自媒体平台,例如某音、蝴蝶号都刷到,下面这种妖精变身的短视频,我也经常刷到,这种视频我们可以看到点赞、收藏、评论的数据都非常的高,动辄就是几千、几万,下面这个账号就5条笔记就达到7500多粉丝,可想而知这种类型的视频有多火。那么它为什么会这么火呢?这......
  • 深入解析:JWT Bearer 认证在 .NET Core 中的应用
    在现代Web应用中,安全认证是确保用户数据和系统安全的重要一环。JSONWebToken(JWT)是一种流行的认证方式,它可以在客户端和服务端之间安全地传递信息。本文将详细介绍JWTBearer认证的概念、工作原理、在.NETCore中的实现步骤,以及最佳实践。一、什么是JWT?JSONWebTok......
  • 语音IC方案,在交通信号灯语音提示器的应用解析,NV040D
    随着智能化城市的快速发展,语音IC方案在交通信号灯语音提示器中的应用愈发显得重要且高效。NV040D作为一款先进的语音合成芯片,凭借其卓越的音质还原能力和灵活的编程接口,成为了众多交通管理部门的首要选择。一、方案介绍NV040D语音芯片不仅支持多种语言和方言的合成,还能根据交通信号......
  • 一文详解精细化工行业持续增长的策略与路径解析
    随着全球经济的快速发展和科技的不断进步,精细化工行业正面临着前所未有的挑战和机遇。在这个过程中,数字化转型已成为推动行业持续增长的关键因素。精细化工行业,作为化学工业的一个重要分支,其产品广泛应用于医药、农药、涂料、香料等多个领域,对提高产品质量、优化生产流程、降低成......