Python Web 开发:FastAPI 基本概念与应用
Python Web 开发:FastAPI 基本概念与应用
目录
- ✨ 1. FastAPI 路由(定义请求路径)
- 🚀 2. HTTP 请求方法(GET、POST、PUT、DELETE)
- 🔑 3. 参数类型(路径参数、查询参数、请求体)
- 🌍 查询参数(
query
) - 🛣️ 路径参数(
path
) - 📝 请求体(
body
)
- 🌍 查询参数(
✨ 1. FastAPI 路由(定义请求路径)
在 FastAPI 中,路由是定义在应用实例上的一组函数,用于响应 HTTP 请求。路由的核心是通过 URL 路径和 HTTP 请求方法来匹配请求,这些请求会由相应的函数处理。每个路由装饰器(如 @app.get()
、@app.post()
)都代表一个特定的请求路径和 HTTP 方法。
路由基本定义
FastAPI 提供了简单而强大的路由机制。定义一个基本的路由时,只需在 FastAPI 实例上使用装饰器来指定 HTTP 方法和路径。以下是一个最简单的示例:
# app/main.py
from fastapi import FastAPI# 创建 FastAPI 应用实例
app = FastAPI()# 定义一个 GET 路由
@app.get("/")
def read_root():return {"message": "Welcome to FastAPI!"}
在上述代码中,我们通过 @app.get("/")
定义了一个根路径的 GET 请求,当访问 http://127.0.0.1:8000/
时,会返回 JSON 响应 {"message": "Welcome to FastAPI!"}
。
动态路由与路径参数
FastAPI 路由也支持动态路径参数,这使得可以通过 URL 路径传递信息。这些参数可以用于获取数据库中的特定资源,或者进行其他计算。
@app.get("/items/{item_id}")
def read_item(item_id: int):return {"item_id": item_id}
在这个例子中,{item_id}
表示一个路径参数。当访问 http://127.0.0.1:8000/items/42
时,FastAPI 会将路径中的 42
传递给 item_id
变量。
多路径和多方法支持
一个 FastAPI 路由不仅支持单一的路径和方法,实际上,可以为同一路径配置多种 HTTP 方法,比如 GET
和 POST
方法,用于处理不同类型的请求。以下是如何为同一路径添加多个路由:
@app.get("/items/{item_id}")
def read_item(item_id: int):return {"message": f"Fetching item {item_id}"}@app.post("/items/{item_id}")
def create_item(item_id: int):return {"message": f"Creating item {item_id}"}
在这个示例中,同一个路径 /items/{item_id}
通过 GET
和 POST
方法分别提供不同的服务。GET
方法用于获取项目,而 POST
方法用于创建项目。
路由分组与组织
对于复杂应用,随着功能增加,路由管理也会变得更加复杂。FastAPI 提供了路由分组的功能,可以通过 APIRouter
来组织路由,将相关功能的路由分配到不同的模块中。例如,可以创建一个用于管理用户的路由模块,另一个用于处理商品数据的路由模块。
from fastapi import APIRouterrouter = APIRouter()@router.get("/users/{user_id}")
def read_user(user_id: int):return {"user_id": user_id}# 将子路由注册到主应用
app.include_router(router)
通过这种方式,开发者可以保持路由结构的清晰和可维护性,避免单一文件中路由过多导致的代码混乱。
🚀 2. HTTP 请求方法(GET、POST、PUT、DELETE)
在 Web 开发中,不同的 HTTP 请求方法有不同的用途,它们是 HTTP 协议的一部分,用来指示客户端请求的意图。在 FastAPI 中,可以通过不同的路由装饰器来定义不同的 HTTP 方法。
GET 请求
GET
请求是最常见的 HTTP 方法,用于请求资源。它通常用于获取数据或展示信息,而不会对服务器上的数据进行任何修改。FastAPI 使用 @app.get()
来处理 GET
请求。
@app.get("/items/{item_id}")
def get_item(item_id: int):return {"item_id": item_id, "name": "Example Item"}
GET
请求通常是无副作用的,也就是说,它不会修改服务器上的任何数据。它只是请求某些数据。
POST 请求
与 GET
请求不同,POST
请求通常用于提交数据,以便服务器进行处理。这类请求会改变服务器的状态,通常用于创建新的资源。FastAPI 使用 @app.post()
来处理 POST
请求。
@app.post("/items/")
def create_item(item: dict):return {"message": "Item created", "item": item}
在这个例子中,POST
请求用于接收一个 JSON 数据,并返回创建的项的信息。POST
请求通常用于向服务器提交表单数据,或创建新的资源。
PUT 请求
PUT
请求用于更新现有的资源。与 POST
请求不同,PUT
请求通常是幂等的,意味着多次执行同样的 PUT
请求不会导致不同的结果。FastAPI 使用 @app.put()
来处理 PUT
请求。
@app.put("/items/{item_id}")
def update_item(item_id: int, item: dict):return {"message": f"Item {item_id} updated", "item": item}
PUT
请求接收的数据通常是完整的资源数据,它会替换服务器上指定资源的当前状态。
DELETE 请求
DELETE
请求用于删除服务器上的资源。当客户端发送一个 DELETE
请求时,通常是请求服务器删除某个指定的资源。FastAPI 使用 @app.delete()
来处理 DELETE
请求。
@app.delete("/items/{item_id}")
def delete_item(item_id: int):return {"message": f"Item {item_id} deleted"}
DELETE
请求通常用于从数据库中删除指定的数据,或者清理服务器上的某些资源。
小结
通过 GET
、POST
、PUT
和 DELETE
等 HTTP 请求方法,FastAPI 为开发者提供了处理不同类型请求的灵活性。在实际开发中,了解并正确使用这些请求方法对于设计良好的 API 至关重要。通过合理的 HTTP 方法使用,可以确保 API 的语义清晰且符合 RESTful 风格。
🔑 3. 参数类型(路径参数、查询参数、请求体)
FastAPI 提供了强大的参数类型支持,能够非常简便地处理 URL 路径、查询参数以及请求体的参数。这些参数可以帮助开发者在处理请求时灵活获取数据。
🌍 查询参数(query
)
查询参数通常出现在 URL 的 ?
后面,并且以 key=value
的形式传递给服务器。在 FastAPI 中,查询参数会自动被映射为函数的参数,可以使用默认值来定义可选的查询参数。
@app.get("/items/")
def read_items(skip: int = 0, limit: int = 10):return {"skip": skip, "limit": limit}
在这个例子中,skip
和 limit
是查询参数,它们的默认值分别是 0
和 10
。当请求 URL 为 http://127.0.0.1:8000/items/?skip=5&limit=15
时,FastAPI 会将 skip
设置为 5
,limit
设置为 15
。
查询参数通常用于分页、筛选和排序等场景。通过为查询参数提供默认值,FastAPI 可以轻松实现这些常见的功能。
🛣️ 路径参数(path
)
路径参数是在 URL 路径中传递的变量,它们用于标识请求的特定资源。路径参数通常出现在 URL 中的 {}
中,在 FastAPI 中,我们可以通过定义路径参数来动态地处理不同的资源。
@app.get("/items/{item_id}")
def read_item(item_id: int):return {"item_id": item_id}
在这个例子中,item_id
是路径参数,FastAPI 会自动从 URL 中提取路径参数的值,并将其传递给处理函数。在访问 http://127.0.0.1:8000/items/42
时,item_id
会被自动解析为 42
。
路径参数通常用于资源标识符,它们是 URL 的一部分,必须匹配请求的路径。
📝 请求体(body
)
请求体通常用于发送更复杂的数据,特别是 POST
、PUT
或 PATCH
请求。
请求体可以是 JSON 格式的对象、表单数据或文件。FastAPI 支持通过 Pydantic
模型来验证和解析请求体。
from pydantic import BaseModelclass Item(BaseModel):name: strdescription: str = Noneprice: float@app.post("/items/")
def create_item(item: Item):return {"item": item}
在这个例子中,Item
是一个 Pydantic 模型,它自动验证请求体的数据结构是否符合要求。FastAPI 会自动将请求体的 JSON 数据转换为 Item
实例,并传递给处理函数。
请求体通常用于提交复杂的数据,比如创建或更新资源时所需的信息。
小结
FastAPI 提供了非常灵活的参数处理机制,通过路径参数、查询参数和请求体,开发者可以轻松地从不同的 HTTP 请求中提取数据,并根据需要进行处理。通过自动验证和类型注解,FastAPI 确保了数据的完整性和正确性,减少了开发者的负担。
相关文章:
Python Web 开发:FastAPI 基本概念与应用
Python Web 开发:FastAPI 基本概念与应用 目录 ✨ 1. FastAPI 路由(定义请求路径)🚀 2. HTTP 请求方法(GET、POST、PUT、DELETE)🔑 3. 参数类型(路径参数、查询参数、请求体&#…...
Linux设置开启启动脚本
1.问题 每次启动虚拟机需要手动启动网络,不然没有enss33选项 需要启动 /mnt/hgfs/dft_shared/init_env/initaial_env.sh 文件 2.解决方案 2.1 修改/etc/rc.d/rc.local 文件 /etc/rc.d/rc.local 文件会在 Linux 系统各项服务都启动完毕之后再被运行。所以你想要…...
go并发设计模式runner模式
go并发设计模式runner模式 真正运行的程序不可能是单线程运行的,go语言中最值得骄傲的就是CSP模型了,可以说go语言是CSP模型的实现。 假设现在有一个程序需要实现,这个程序有以下要求: 程序可以在分配的时间内完成工作࿰…...
nn.RNN解析
以下是RNN的计算公式,t时刻的隐藏状态H(t)等于前一时刻隐藏状态H(t-1)乘以参数矩阵,再加t时刻的输入x(t)乘以参数矩阵,最后再通过激活函数,等到t时刻隐藏状态。 下图是输出input和初始化的隐藏状态,当参数batch_first True时候&…...
How to monitor Spring Boot apps with the AppDynamics Java Agent
本文介绍如何使用 AppDynamics Java 代理监视 Azure Spring Apps 中的 Spring Boot 应用程序。 使用 AppDynamics Java 代理可以: 监视应用程序使用环境变量配置 AppDynamics Java 代理 在 AppDynamics 仪表板中检查所有监视数据 How to monitor Spring Boot app…...
Linux学习笔记12 systemd的其他命令
前文已经介绍了systemd在系统初始化中起到的作用和服务的管理和配置。这里补充一下systemd的其他工具和系统进程的管理 前文 Linux学习笔记10 系统启动初始化,服务和进程管理(上)-CSDN博客 Linux学习笔记11 系统启动初始化,服务…...
NGO-CNN-BiGRU-Attention北方苍鹰算法优化卷积双向门控循环单元时间序列预测,含优化前后对比
NGO-CNN-BiGRU-Attention北方苍鹰算法优化卷积双向门控循环单元时间序列预测,含优化前后对比 目录 NGO-CNN-BiGRU-Attention北方苍鹰算法优化卷积双向门控循环单元时间序列预测,含优化前后对比预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介…...
【分布式】分布式缓存
一、什么是分布式缓存 分布式缓存是一种将缓存数据存储在多个节点上的缓存方案。它通过将数据分散存储在多个节点的内存中,以提高系统的读取性能、降低数据库压力和提高系统可扩展性。 二、分布式缓存的优点 优点明细提高性能:分布式缓存可以将数据缓…...
深度学习中的迁移学习:应用与实践
引言 在深度学习领域,迁移学习(Transfer Learning)是一个非常强大且日益流行的概念,它通过将从一个任务中学到的知识应用于另一个任务,能够显著加快模型训练速度并提高其泛化能力。迁移学习在许多实际应用中都得到了广…...
28.UE5实现对话系统
目录 1.对话结构的设计(重点) 2.NPC对话接口的实现 2.1创建类型为pawn的蓝图 2.2创建对话接口 3.对话组件的创建 4.对话的UI设计 4.1UI_对话内容 4.2UI_对话选项 4.3UI_对话选项框 5.对话组件的逻辑实现 通过组件蓝图,也就是下图中的…...
Redis中的分布式锁(步步为营)
分布式锁 概述 分布式锁指的是,所有服务中的所有线程都去获取同一把锁,但只有一个线程可以成功的获得锁,其他没有获得锁的线程必须全部等待,直到持有锁的线程释放锁。 分布式锁是可以跨越多个实例,多个进程的锁 分布…...
CentOS 7安装mysql+JDK+Tomcat完成流程
一.安装mysql 即使是新的linux服务器,也要先验证是否有mysql已经安装,如果有进行卸载原版本,一定要确认是否mysql已不再使用 原安装情况(直接执行命令即可) whereis mysql rpm -qa | grep -i mysql rpm -e perl-DBD-M…...
C++笔记之不同框架中事件循环的核心函数:io_run()、ros_spin()、app_exec()
C笔记之不同框架中事件循环的核心函数:io_run()、ros_spin()、app_exec() code review! 参考笔记 1.qt-C笔记之使用QtConcurrent异步地执行槽函数中的内容,使其不阻塞主界面 2.qt-C笔记之QThread使用 3.qt-C笔记之多线程架构模式:事件信号监…...
C++异常处理
目录 一、异常的概念 二、异常的使用 (1)异常的抛出和捕获 (2)异常的重新抛出 (3)异常安全 (4)异常规范 三、自定义异常体系 四、c标注异常体系 五、异常的优缺点 在之前我们…...
【数据结构】哈希 ---万字详解
unordered系列关联式容器 在C98中,STL提供了底层为红黑树结构的一系列关联式容器,在查询时效率可达到log_2 N,即最差情况下需要比较红黑树的高度次,当树中的节点非常多时,查询效率也不理想。最好 的查询是,…...
4399大数据面试题及参考答案(数据分析和数据开发)
对数据分析的理解 数据分析是一个从数据中提取有价值信息以支持决策的过程。它涵盖了数据收集、清洗、转换、建模和可视化等多个环节。 首先,数据收集是基础。这包括从各种数据源获取数据,例如数据库、文件系统、网络接口等。这些数据源可以是结构化的数据,如关系型数据库中…...
快速理解倒排索引在ElasticSearch中的作用
一.基础概念 定义: 倒排索引是一种数据结构,用来加速文本数据的搜索和检索,和传统的索引方式不同,倒排索引会被每个词汇项与包含该词汇项的文档关联起来,从而去实现快速的全文检索。 举例: 在传统的全文…...
C++趣味编程玩转物联网:基于树莓派Pico控制无源蜂鸣器-实现音符与旋律的结合
无源蜂鸣器是一种多功能的声音输出设备,与有源蜂鸣器相比,它能够通过不同频率的方波生成丰富多样的音调。本项目使用树莓派Pico开发板,通过编程控制无源蜂鸣器播放经典旋律《归来有风》。本文将详细介绍项目实现中的硬件连接、C++代码解析,以及无源蜂鸣器的工作原理。 一、…...
《RuoYi基于SpringBoot+Vue前后端分离的Java快速开发框架学习》系列博客_Part4_三模态融合
系列博客目录 文章目录 系列博客目录目标Step1:之前工作形成子组件Step2:弥补缺失的文本子组件,同时举例如何子组件向父组件传数据Step3:后端代码需要根据上传的文件传给python服务器Step4:python服务器进行分析 目标 实现三模态融合,将文本、图片、音频…...
springboot365高校疫情防控web系统(论文+源码)_kaic
毕 业 设 计(论 文) 题目:高校疫情防控的设计与实现 摘 要 互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以很好地为…...
STM32 USART串口数据包
单片机学习! 目录 前言 一、数据包 二、HEX数据包 三、文本数据包 四、HEX数据包和文本数据包优缺点 4.1 HEX数据包 4.2 文本数据包 五、HEX数据包接收 六、文本数据包接收 总结 前言 本文介绍了串口数据包收发的思路和流程。 一、数据包 数据包的作用是把一个个单独…...
【LC】3232. 判断是否可以赢得数字游戏
题目描述: 给你一个 正整数 数组 nums。 Alice 和 Bob 正在玩游戏。在游戏中,Alice 可以从 nums 中选择所有个位数 或 所有两位数,剩余的数字归 Bob 所有。如果 Alice 所选数字之和 严格大于 Bob 的数字之和,则 Alice 获胜。如果…...
Linux基础学习--vi与vim
0.绪论 前面的内容基本学完了相关命令行,后面进行shell与shell script的学习。第一部分就是编辑器的学习,之前有写过vi/vim编辑器,但是我看了一下鸟哥这个非常详细,还是打算重头学习一下。 1.vi/vim的使用 一般命令模式(command…...
JavaScript 高级教程:异步编程、面向对象与性能优化
在前两篇教程中,我们学习了 JavaScript 的基础和进阶内容。这篇文章将带领你进入更深层次,学习 JavaScript 的异步编程模型、面向对象编程(OOP),以及性能优化的技巧。这些内容对于构建复杂、流畅的前端应用至关重要。 …...
qt QToolBox详解
1、概述 QToolBox是Qt框架中的一个控件,它提供了一个带标签页的容器,用户可以通过点击标签页标题来切换不同的页面。QToolBox类似于一个带有多页选项卡的控件,但每个“选项卡”都是一个完整的页面,而不仅仅是标签。这使得QToolBo…...
翁知宜荣获“易学名师”与“国学文化传承人”称号
在2024年10月19日举行的北京第六届国学文化传承峰会上,翁知宜老师以其在易学界的卓越成就和对国学文化的传承与发扬,荣获“易学名师”和“国学文化传承人”两项荣誉称号。 翁知宜老师在易经学术竞赛中荣获第一名,其深厚的易学造诣和对玄学学…...
20241128解决Ubuntu20.04安装libwxgtk3.0-dev异常的问题
20241128解决Ubuntu20.04安装libwxgtk3.0-dev异常的问题 2024/11/28 16:17 缘起:中科创达的高通CM6125开发板的Android10的编译环境需要。 安装异常:rootrootrootroot-X99-Turbo:~$ rootrootrootroot-X99-Turbo:~$ sudo apt-get install libwxgtk3.0-de…...
sql分类
SQL(Structured Query Language)是一种用于管理和操作关系数据库管理系统(RDBMS)的编程语言。SQL 可以分为几个主要类别,每个类别都有其特定的用途和功能。以下是 SQL 的主要分类: 1. 数据定义语言&#x…...
stm32里一个定时器可以提供多路信号吗?
在STM32中,一个定时器通常只能提供一组信号(如输出PWM波形、定时中断等)。但是,定时器的多个通道可以提供不同的信号。例如,STM32的定时器可以通过不同的输出通道产生多种PWM信号,每个通道可以配置为不同的…...
Java安全—原生反序列化重写方法链条分析触发类
前言 在Java安全中反序列化是一个非常重要点,有原生态的反序列化,还有一些特定漏洞情况下的。今天主要讲一下原生态的反序列化,这部分内容对于没Java基础的来说可能有点难,包括我。 序列化与反序列化 序列化:将内存…...
网站开发流程图/网站优化网络推广seo
俗话说万事开头难,学习新知识也是如此,当我们下定决心要实现UNP中的例子时,发现却无法将程序部署上去,这种感觉是不是很令人沮丧?本文就是用来给我自己这种linux菜鸟扫盲用的。首先,UNP的源码链接为 点击打…...
怎么查询网站的域名/南通百度网站快速优化
一、商品模块数据库&代码工具准备 1.数据库准备: 2.中导入工具类: 二、商品品牌 - 后端实现 1.集成模板生成代码 - 配置query和controller - 具体可看项目源码 // 调整 query 生成目录演示 focList.add(new FileOutConfig("/templates/query…...
湛江疫情最新通报/360优化大师最新版的功能
GitLab是由Ruby语言开发的基于Linux的Git服务器,是我见过的最强大的Git服务器。发现它之后,立即决定将Git服务器换成GitLab。 但安装好GitLab之后面临一个问题,如何将服务器上的git项目直接导入到GitLab,之前的Git服务器是由是git…...
软件开发的工资/丽水百度seo
前言 今天主要讲一下JQ中的异步编程,它将ajax进行封装,在进行异步请求时显得非常容易,无论是GET,POST方式,还是text,xml,javascript,json等数据通讯都是那么的自然 现在,我们就走入jq的ajax的殿堂吧。 GET请…...
阿里建站模板/百度站长平台app
前言 Common Language Runtime(CLR)是一个很强大的运行时,它接收 Common Intermediate Language(CIL) 的输入并最终产生机器代码并执行。CIL 在 CLR 上相当于 ASM 汇编代码的存在。 CLR 之上的语言 C#、F#、VB.NET 等…...
网站建设投资风险分析/搜索引擎优化策略应该包括
boolean 数据类型 boolean 变量存储为 8位(1 个字节)的数值形式,但只能是 True 或是 False,可以把它看做是一个“开关”来使用。boolean 变量的值显示为 True 或 False(在使用 Print 的时候),或…...