FastAPI 路径参数详解:动态路径与数据校验的灵活实现
FastAPI 路径参数详解:动态路径与数据校验的灵活实现
本文全面介绍了在 FastAPI 中使用路径参数的技巧和实现方式。路径参数允许 API 动态响应不同路径中的请求信息,结合 URL(Uniform Resource Locator)和 URI(Uniform Resource Identifier)进行资源定位和标识。URL 是指资源的完整访问路径,用于确定资源的具体位置,而 URI 则是更广义的概念,包含 URL,在 URL 的基础上提供对特定资源的唯一标识。文中通过类型声明实现了路径参数的数据转换与校验,确保路径中的参数符合预期格式。本文还展示了路径参数类型、数据校验、路径操作顺序和 Enum 类型的使用,提供了定义固定值路径参数的示例。此外,文章解释了如何声明包含文件路径的路径参数,并提供了具体的代码示例,是学习 FastAPI 路径参数与资源标识的实用指南。
文章目录
- FastAPI 路径参数详解:动态路径与数据校验的灵活实现
- 一 路径参数
- 1 示例
- 2 路径参数类型
- 3 数据转换
- 4 数据校验
- 二 路径操作的顺序
- 三 使用 `Enum` 类型预定义路径参数的值
- 1 比较枚举元素
- 2 获取枚举值
- 3 返回枚举元素
- 四 包含文件路径的路径参数
- 五 完整代码示例
- 六 源码地址
一 路径参数
在 FastAPI 中,路径参数通过在路径字符串中包含变量来定义。路径参数用于接收请求 URL 中的动态部分,使得 API 可以根据不同的路径值响应不同的内容。具体来说,路径参数在路径中通过花括号来标识,并在相应的函数参数中进行定义和使用。例如,在路径 /items/{item_id} 中,{item_id} 就是路径参数。
1 示例
以下是一个简单的示例代码:
from fastapi import FastAPIapp = FastAPI()@app.get("/items/{item_id}")
async def read_item(item_id):return {"item_id": item_id}
在这个例子中,路径参数 item_id 的值会被传递给路径操作函数的参数 item_id。可以运行代码文件 chapter02.py 来启动应用:
$ uvicorn chapter02:app --reload
访问自动生成的 API 文档 Swagger UI:http://127.0.0.1:8000/docs。通过访问 http://127.0.0.1:8000/items/foo,可以获得如下返回:
{"item_id": "foo"}
2 路径参数类型
在以下代码中,item_id 的类型声明为 int:
from fastapi import FastAPIapp = FastAPI()@app.get("/items02/{item_id}")
async def read_item(item_id: int):return {"item_id": item_id}
3 数据转换
FastAPI 可以通过类型声明自动解析请求中的数据并进行数据转换。例如,路径 /items/3 中的字符串 3 会被自动转换为整数 3。
4 数据校验
FastAPI 使用 Python 类型声明来实现数据校验。如果请求中的值与声明的类型不匹配,将返回错误信息。例如,对于 async def read_item(item_id: int),当请求路径为 /items/foo 时,返回的错误信息如下:
{"detail": [{"type": "int_parsing","loc": ["path","item_id"],"msg": "Input should be a valid integer, unable to parse string as an integer","input": "foo"}]
}
在 FastAPI 中,数据校验由 Pydantic 实现。
二 路径操作的顺序
路径操作按定义顺序依次运行。如果一个 URI 既与特定路径匹配,又与包含路径参数的路径匹配,应将特定路径的操作放在前面,包含路径参数的路径写在后面。例如:
from fastapi import FastAPIapp = FastAPI()@app.get("/users/me")
async def read_user_me():return {"user_id": "the current user"}@app.get("/users/{user_id}")
async def read_user(user_id: str):return {"user_id": user_id}
注意:/users/me 必须在 /users/{user_id} 之前声明,否则 /users/{user_id} 将匹配 /users/me,并将 me 作为 user_id 的值。
三 使用 Enum 类型预定义路径参数的值
可以使用 Python 的 Enum 类型来预定义路径参数的值。
from enum import Enum
from fastapi import FastAPIclass ModelName(str, Enum):alexnet = "alexnet"resnet = "resnet"lenet = "lenet"app = FastAPI()@app.get("/models/{model_name}")
async def get_model(model_name: ModelName):if model_name is ModelName.alexnet:return {"model_name": model_name, "message": "Deep Learning FTW!"}if model_name.value == "lenet":return {"model_name": model_name, "message": "LeCNN all the images"}return {"model_name": model_name, "message": "Have some residuals"}
使用 Enum 类(ModelName)可以为路径参数 model_name 设置类型注解。
1 比较枚举元素
if model_name is ModelName.alexnet:
2 获取枚举值
model_name.value
或
ModelName.lenet.value
3 返回枚举元素
return {"model_name": model_name, "message": "Have some residuals"}
请求访问 http://127.0.0.1:8000/models/resnet 时,客户端将收到如下 JSON 响应:
{"model_name": "resnet","message": "Have some residuals"
}
四 包含文件路径的路径参数
可以直接使用 Starlette 的选项声明包含路径的路径参数:
/files/{file_path:path}
在这个示例中,参数名为 file_path,结尾部分的 :path 表示该参数应匹配整个路径。例如,包含 /home/your/myfile.txt 的路径参数必须以斜杠(/)开头。在这个例子中,URI 为 /files//home/your/myfile.txt,files 和 home 之间需要使用双斜杠(//)。
注:OpenAPI 不支持声明包含路径的路径参数,因此访问 /files/{file_path} 时可能会报错 {"detail": "Not Found"}。
五 完整代码示例
from fastapi import FastAPI
from enum import Enumapp = FastAPI()@app.get("/items/{item_id}")
async def read_item(item_id):return {"item_id": item_id}@app.get("/items02/{item_id}")
async def read_item(item_id: int):return {"item_id": item_id}@app.get("/users/me")
async def read_user_me():return {"user_id": "the current user"}@app.get("/users/{user_id}")
async def read_user(user_id: str):return {"user_id": user_id}class ModelName(str, Enum):alexnet = "alexnet"resnet = "resnet"lenet = "lenet"@app.get("/models/{model_name}")
async def get_model(model_name: ModelName):if model_name is ModelName.alexnet:return {"model_name": model_name, "message": "Deep Learning FTW!"}if model_name.value == "lenet":return {"model_name": model_name, "message": "LeCNN all the images"}return {"model_name": model_name, "message": "Have some residuals"}@app.get("/files/{file_path:path}")
async def read_file(file_path: str):return {"file_path": file_path}
六 源码地址
详情见:GitHub FastApiProj
引用: FastAPI 文档
相关文章:
FastAPI 路径参数详解:动态路径与数据校验的灵活实现
FastAPI 路径参数详解:动态路径与数据校验的灵活实现 本文全面介绍了在 FastAPI 中使用路径参数的技巧和实现方式。路径参数允许 API 动态响应不同路径中的请求信息,结合 URL(Uniform Resource Locator)和 URI(Unifor…...
【STM32】SD卡
(一)常用卡的认识 在学习这个内容之前,作为生活小白的我对于SD卡、TF卡、SIM卡毫无了解,晕头转向。 SD卡:Secure Digital Card的英文缩写,直译就是“安全数字卡”。一般用于大一些的电子设备比如:电脑、数码相机、AV…...
我一口气记录下整个接口自动化测试过程!
一、为什么选用postman postman调试工具无论对于开发和测试小白,还是技术大牛来说应该都耳熟能详,在过去的几年里大家对这款工具应用最广的用途是把当作接口调试的测试工具,它能发送几乎所有类型的HTTP请求,操作界面非常简洁美观…...
【VS中Git同步提交 报错:访问.vs/FileContentIndex/xxx.vsidx权限不允许】
参考: Git commit vsidx file access denied in Visual Studio 一劳永逸的方法: 在VSCode里,Git->设置->选项:编辑.gitignore文件,如下图: 忽略整个.vs文件夹,再重新提交就不会有涉及…...
Linux下Nginx的安装与使用
Linux下Nginx的安装与使用 博客: www.lstar.icu 开源地址 Gitee 地址: https://gitee.com/lxwise/iris-blog_parent Github 地址: https://github.com/lxwise/iris-blog_parent 序言 Nginx是一款轻量级的Web 服务器/反向代理服务器及电子…...
飞机布雷盖航程公式
飞机布雷盖航程公式 1. 喷气式飞机布雷盖航程公式推导2. 螺旋桨飞机布雷盖航程公式推导3. 喷气式飞机与螺旋桨飞机的差异分析3.1 喷气式飞机的推力产生机制3.2 螺旋桨推进推力产生机制 布雷盖航程公式(Breguet Range Equation)是描述飞行器巡航飞行阶段航…...
在K8s平台部署个人博客
在K8s平台部署个人博客 实验步骤查看wordpress前端的service浏览器访问http://node_ip:30090 实验步骤 kubectl create secret generic mysql-pass --from-literalpasswordYOUR_PASSWORD把mysql.tar.gz和wordpress.tar.gz上传到K8s工作节点,手动解压即可࿱…...
git入门教程10:git性能优化
一、配置优化 使用SSH协议: 相比HTTP/HTTPS协议,SSH协议在网络传输中更高效,且支持更安全的认证方式。确保你的远程仓库URL使用的是SSH协议,例如:git clone gitgithub.com:username/repo.git。 调整Git缓冲区大小&…...
Redis(2):内存模型
一、Redis内存统计 工欲善其事必先利其器,在说明Redis内存之前首先说明如何统计Redis使用内存的情况。 在客户端通过redis-cli连接服务器后(后面如无特殊说明,客户端一律使用redis-cli),通过info命令可以查看内存使用情…...
深入解析Diffusion和AsymmDiT:Mochi 1的高效AI视频生成之路
随着AI视频生成技术的迅猛发展,各种模型纷纷涌现,各自展现出独特的优势。近期,Genmo 推出了新一代视频生成模型——Mochi 1,以其非对称架构设计和高效生成流程在业界备受瞩目。作为开源模型,Mochi 1不仅在视觉生成质量…...
VMware capacity mismatch for disk错误解决办法:kb-vuln-1靶机
https://www.vulnhub.com/entry/kb-vuln-1,540/ 本机安装有: VMware Workstation 16 Pro 16.2.1 build-18811642VirtualBox 图形用户界面 版本 5.2.30 r130521 (Qt5.6.2) vm16.2支持wsl2,所以我得让vm16.2跑靶机,VirtualBox5.2可以导入靶机,但是无法开机(不支持wsl2),得升级 …...
Java Collection/Executor LinkedTransferQueue 总结
前言 相关系列 《Java & Collection & 目录》《Java & Executor & 目录》《Java & Collection/Executor & LinkedTransferQueue & 源码》《Java & Collection/Executor & LinkedTransferQueue & 总结》《Java & Collection/Execu…...
阿拉伯国家本地化测试的特点
针对阿拉伯国家的应用程序的本地化测试需要详细了解语言、文化背景、地区规范和技术细节,以符合阿拉伯语用户的期望。这些国家包括沙特阿拉伯、阿拉伯联合酋长国、科威特、卡塔尔、巴林和阿曼,具有独特的语言和文化因素,成功地本地化测试解决…...
申请前必知!关于「美国绿卡」的28个常见问题汇总!
01 美国绿卡的类别 美国绿卡分为多个类别,如亲属移民、职业移民、投资移民等。每个类别有不同的申请要求和优先级。选择最适合自己的类别,并深入了解相关法律和政策,是成功申请的第一步。 02 移民路径选择 根据个人情况(如职业…...
2024年十款超好用的图纸防泄密软件精选,十款优秀的图纸防泄密软件推荐
在当今竞争激烈的商业环境中,图纸作为企业的核心资产和智慧结晶,其安全性至关重要。一旦图纸泄露,可能会给企业带来巨大的经济损失和竞争劣势。因此,选择一款可靠的图纸防泄密软件成为了企业保护知识产权的关键。下面为大家推荐十…...
数据库锁机制
数据库锁机制 数据库锁主要分为三大类 1.全局锁 2.表级锁 3.行级锁 全局锁 定义:全局锁是对整个数据库实例加锁,禁止所有对数据库的写操作。 用途:主要用于备份和维护操作。 示例 MySQL FLUSH TABLES WITH READ LOCK;这条命令会锁定所…...
呼叫中心系统如何选型?
呼叫中心系统如何选型? 作者:开源呼叫中心系统 FreeIPCC 采购一套呼叫中心系统是企业提升客户服务质量、优化运营流程、增强市场竞争力的关键步骤。一个合适的呼叫中心系统不仅能提升客户满意度,还能提高内部团队的工作效率,降低…...
Ubuntu 22.04安装部署
一、部署环境 表 1‑1 环境服务版本号系统Ubuntu22.04 server lts运行环境1JDK1.8前端WEBNginx1.8数据库postgresqlpostgresql13postgis3.1pgrouting3.1消息队列rabbitmq3.X(3.0以上)运行环境2erlang23.3.3.1 二、安装系统 2.1安装 1.安装方式,选第一条。 2.选择…...
KINGBASE部署
环境:x86_64 系统:centos7.9 数据库–版本:KingbaseES_V008R006C008B0014_Lin64_install 授权文件–版本:V008R006-license-企业版-90天 一 前置要求 1.1. 硬件环境要求 KingbaseES支持通用X86_64、龙芯、飞腾、鲲鹏等国产C…...
探索 ONLYOFFICE:开源办公套件的魅力
文章目录 引言一、ONLYOFFICE 产品介绍与历史1.1 ONLUOFFICE 介绍1.2 ONLYOFFICE发展历史 二、ONLYOFFICE 的核心功能2.1 文档处理2.2 演示文稿 三、ONLYOFFICE 部署与安装四、ONLYOFFICE 产品优势和挑战五、ONLYOFFICE 案例分析六、ONLYOFFICE 的未来发展七、全文总结 引言 在…...
Bifrost三星固件下载器:免费跨平台获取官方系统的一站式解决方案
Bifrost三星固件下载器:免费跨平台获取官方系统的一站式解决方案 【免费下载链接】Bifrost Cross-platform tool for downloading Samsung mobile device firmware. 项目地址: https://gitcode.com/gh_mirrors/sa/Bifrost 你是否曾为寻找三星设备官方固件而烦…...
别再手动转换时间了!用Jackson和Spring的这两个注解,搞定Java日期序列化所有坑
彻底告别Java日期转换噩梦:Jackson与Spring注解实战指南 如果你曾在Java项目中处理过日期时间转换,一定对以下场景不陌生:前端传过来的字符串日期需要手动解析成Date对象,返回给前端的日期格式乱七八糟,时区问题导致时…...
Mentor DFT实战:手把手教你搞定Wrapped Core的Scan Insertion(附完整TCL脚本)
Mentor DFT实战:Wrapped Core的Scan Insertion全流程解析与TCL脚本精讲 在芯片测试设计领域,Wrapped Core的Scan Insertion一直是工程师们面临的棘手难题。当设计规模不断扩大,核心间交互日益复杂时,传统的扫描链插入方法往往显得…...
ArcGIS Pro 3.x 批量处理遥感栅格:用Python脚本实现自动化转点、计算与导出(附完整代码)
ArcGIS Pro 3.x 遥感栅格自动化处理实战:从数据清洗到生产级流水线构建 遥感数据分析师常常需要处理TB级的时序栅格数据,比如月度NDVI指数、地表温度或降水分布。传统手动操作不仅效率低下,还容易因人为失误导致数据不一致。本文将分享如何基…...
PyTorch矩阵乘法进阶:用torch.matmul高效实现一个简易的Transformer注意力头
PyTorch矩阵乘法进阶:用torch.matmul高效实现一个简易的Transformer注意力头 在深度学习领域,矩阵乘法是构建复杂模型的基石操作。PyTorch作为当前最流行的深度学习框架之一,其torch.matmul函数在实现高效矩阵运算方面发挥着关键作用。本文将…...
Midjourney镜头类型选择终极决策树(附可下载PDF流程图):输入拍摄意图→自动匹配最优镜头词+推荐--stylize值+规避AI视觉歧义
更多请点击: https://kaifayun.com 第一章:Midjourney镜头类型选择终极决策树概览 在 Midjourney V6 中,镜头类型(Lens Type)并非独立参数,而是通过组合 --style raw、 --s 750 及语义化摄影术语提示词协…...
安卓用户专属福利:免费开源工具一键搞定.m3u8.sqlite视频提取与合并(附TS转MP4方法)
安卓用户专属:零门槛实现.m3u8.sqlite视频提取与格式转换全攻略 每次在手机上缓存了课程视频,却发现文件格式无法直接播放?作为安卓用户,你可能经常遇到.m3u8.sqlite这种特殊缓存格式的困扰。本文将为你揭秘这类文件的本质&#x…...
从游戏画面Bug到图形学原理:一次深度测试失败的排查与透视矫正插值的深度理解
从游戏画面Bug到图形学原理:深度测试失败的排查与透视矫正插值解析 深夜调试游戏引擎时,屏幕上的三角形边缘突然出现诡异的闪烁——这种被称为"深度冲突"的现象,往往让开发者陷入漫长的调试循环。本文将以一个实际开发中的深度测试…...
将taotoken作为统一api层整合到企业内部多个ai应用场景中
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 将taotoken作为统一api层整合到企业内部多个ai应用场景中 在企业内部,AI应用正变得无处不在。从智能客服系统自动回复用…...
Prompt核心原则与技巧
1. Prompt的本质Prompt是用户和模型之间的"接口"。设计好的Prompt就像把话说清楚——越清楚,模型越能给你想要的答案。类比:就像你请人帮忙做事:说"帮我处理一下" → 对方可能做错说"帮我把这封信装进信封ÿ…...
