深入解析 FastAPI 查询参数:配置、类型转换与灵活组合
深入解析 FastAPI 查询参数:配置、类型转换与灵活组合
本文全面解析了 FastAPI 查询参数的使用方法,包括配置默认值、设为可选或必选参数、类型转换以及组合使用等实用技巧。通过查询参数,开发者可以在路径操作函数中接收动态输入,灵活地构建 API 接口。文章详细说明了如何利用类型转换实现参数的自动解析和校验,同时展示了多个查询参数和路径参数组合使用的示例,为开发高效、灵活的 API 提供了可靠的指导。
文章目录
- 深入解析 FastAPI 查询参数:配置、类型转换与灵活组合
- 一 简介
- 二 设置默认值
- 三 可选参数
- 四 查询参数类型转换
- 五 多个路径和查询参数
- 六 必选查询参数
- 七 组合参数
- 八 完整代码示例
- 九 源码地址
示例使用 Python 版本为 Python 3.10.15 。
一 简介
路径操作函数会把非路径参数自动解释为查询参数。示例:
from fastapi import FastAPIapp = 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:值为0limit:值为10
二 设置默认值
声明方法 async def read_item(skip: int = 0, limit: int = 10) 时 skip=0 和 limit=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 FastAPIapp = 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 FastAPIapp = 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 FastAPIapp = 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 FastAPIapp = 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 FastAPIapp = 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,默认值为0的int类型参数limit,可选的int类型参数item_id,必选的str类型参数
八 完整代码示例
from fastapi import FastAPIapp = 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 查询参数:配置、类型转换与灵活组合
深入解析 FastAPI 查询参数:配置、类型转换与灵活组合 本文全面解析了 FastAPI 查询参数的使用方法,包括配置默认值、设为可选或必选参数、类型转换以及组合使用等实用技巧。通过查询参数,开发者可以在路径操作函数中接收动态输入࿰…...
大学城水电管理系统开发:Spring Boot指南
2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统,它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等,非常…...
Lua 从基础入门到精通(非常详细)
目录 什么是 Lua? Lua 环境安装 Lua基本语法 注释 数据类型 nil(空) Boolean number(数字) string(字符串) function(函数) userdata thread tableÿ…...
[MySQL#11] 索引底层(2) | B+树 | 索引的CURD | 全文索引
目录 1.B树的特点 索引结构 复盘 其他数据结构的对比 B树与B树总结 聚簇索引与非聚簇索引 辅助索引 2. 索引操作 主键索引 1. 创建主键索引 第一种方式 第二种方式 第三种方式 2. 查询索引 第一种方法 第二种方法 第三种方法 3. 删除索引 删除主键索引 删除…...
一个指针可以被声明为 `volatile`
一个指针可以被声明为 volatile。当指针被声明为 volatile 时,指针本身的地址值可能会在程序之外的控制下发生变化,这意味着编译器在使用该指针时必须每次都重新从内存中读取它的地址,而不能假设指针的地址保持不变。 为什么指针可以是 vola…...
[0260].第25节:锁的不同角度分类
MySQL学习大纲 我的数据库学习大纲 从不同维度对锁的分类: 1.对数据操作的类型划分:读锁和写锁 1.1.读锁 与 写锁概述: 1.对于数据库中并发事务的读-读情况并不会引起什么问题。对于写-写、读-写或写-读这些情况可能会引起一些问题,需要使用…...
android数组控件Textview
说明:android循环控件,注册和显示内容 效果图: step1: E:\projectgood\resget\demozz\IosDialogDemo-main\app\src\main\java\com\example\iosdialogdemo\TimerActivity.java package com.example.iosdialogdemo;import android.os.Bundl…...
openpnp - 手工修改配置文件(元件高度,size,吸嘴)
文章目录 openpnp - 手工修改配置文件(元件高度,size,吸嘴)概述笔记parts.xmlpackages.xml 手工将已经存在的NT1,NT2拷贝出来改名备注END openpnp - 手工修改配置文件(元件高度,size,吸嘴) 概述 载入新板子贴片准备时,除了引入Named CSV文件,还要在ope…...
Java 集合一口气讲完!(中)d=====( ̄▽ ̄*)b
Java 队列 Java集合教程 - Java队列 队列是只能在其上执行操作的对象的集合两端的队列。 队列有两个末端,称为头和尾。 在简单队列中,对象被添加到尾部并从头部删除并首先删除首先添加的对象。 Java Collections Framework支持以下类型的队列。 简单…...
位运算:计算机科学中的基本操作
深入探讨位运算:计算机科学中的基本操作 位运算是计算机科学中的一种重要工具,它直接作用于数据的二进制位,能够高效地进行数据处理。本文将详细介绍位运算的基本概念、种类以及其实际应用。 什么是位运算? 位运算是对整数的二…...
MPSK(BPSK/QPSK/8PSK)调制解调的Matlab仿真全套
一、概述 MPSK(BPSK、QPSK、8PSK)等是常用的相位调制方式,本文对数据获取、比特流组织、基带调制、上变频发送、添加噪声、接收下变频、基带解调、数据还原等过程进行仿真。 模块化、通用化设计,将函数分为(1)数据读取转比特流;(2)基带调制【参数控制调制类型】;(…...
如何为STM32的EXTI(外部中断)编写程序
要为STM32的EXTI(外部中断)编写程序,你需要遵循以下步骤: 1. 初始化GPIO 首先,需要初始化连接到外部中断线的GPIO引脚。这个引脚需要配置为输入模式,并且根据需要选择上拉、下拉或浮空。 GPIO_InitTypeDe…...
八、快速入门Kubernetes之service
文章目录 Service:one: VIP和Service代理:star: 代理模式分类2、iptables代理模式3、ipvs代理模式 :two: ClusterIP:three:实列Service:four: Headless Service实列:five: NodePort:six: LoadBalancer:seven: ExternalName Service ⭐️ 概念:Kubernetes Service 定…...
JVM 类加载机制详解
JVM 类加载机制详解 在 Java 虚拟机(JVM)中,类加载机制是一个非常重要的组成部分,它负责将类的字节码文件加载到内存中,并进行一系列的处理,最终使类能够被虚拟机使用。本文将详细介绍 JVM 类加载机制的相…...
在 JavaScript 中,`Array.prototype.filter` 方法用于创建一个新数组,该数组包含通过测试的所有元素
文章目录 1、概念在你的代码中的作用示例总结 2、实战3、formattedProducts4、filteredProducts 1、概念 在 JavaScript 中,Array.prototype.filter 方法用于创建一个新数组,该数组包含通过测试的所有元素。具体来说,filter 方法会遍历数组中…...
63 mysql 的 行锁
前言 我们这里来说的就是 我们在 mysql 这边常见的 几种锁 行共享锁, 行排他锁, 表意向共享锁, 表意向排他锁, 表共享锁, 表排他锁 意向共享锁, 意向排他锁, 主要是 为了表粒度的锁获取的同步判断, 提升效率 意向共享锁, 意向排他锁 这边主要的逻辑意义是数据表中是否有任…...
ubuntu文件编辑操作
Vim 基本操作指南 在 vim 中打开文件后,可以按照以下步骤进行编辑和保存: 进入插入模式 打开文件后,默认情况下 vim 处于命令模式,无法直接输入文本。按下 i 键进入插入模式(会看到左下角显示 -- INSERT --࿰…...
Nuxt.js 应用中的 nitro:config 事件钩子详解
title: Nuxt.js 应用中的 nitro:config 事件钩子详解 date: 2024/11/2 updated: 2024/11/2 author: cmdragon excerpt: nitro:config 是 Nuxt 3 中的一个生命周期钩子,允许开发者在初始化 Nitro 之前自定义 Nitro 的配置。Nitro 是 Nuxt 3 的服务器引擎,负责处理请求、渲…...
【前端】项目中遇到的问题汇总(长期更新)
一、联调交互类 1、出现一个数据在当前页面进行了修改,另外一个页面的同一数据并未同步更改 当前的数据经过调用接口修改更新以后,if(code 200) 将当前数据存入store.dispatch, 然后另一个地方获取该数据,直接获取存入的数据,这…...
DAY73WEB 攻防-支付逻辑篇篡改属性值并发签约越权盗用算法溢出替换对冲
知识点: 1、支付逻辑-商品本身-修改-数量&价格&属性等 2、支付逻辑-营销折扣-优惠券&积分&签约&试用等 3、支付逻辑-订单接口-替换&并发&状态值&越权支付等 支付逻辑常见测试: 熟悉常见支付流程:选择商品…...
XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...
【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...
人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式
今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...
AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机
这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...
虚拟电厂发展三大趋势:市场化、技术主导、车网互联
市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦࿰…...
【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error
在前端开发中,JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作(如 Promise、async/await 等),开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝(r…...
