FastAPI 核心概念:构建高性能的 Python Web 服务

FastAPI 核心概念:构建高性能的 Python Web 服务

本文详细解析了如何利用 FastAPI 构建高性能的 Python Web 服务,帮助开发者从零开始创建功能丰富、响应迅速的 API。结合完整的代码示例和分步操作指导,文章深入讲解了 FastAPI 的核心概念,包括路径、操作、装饰器、HTTP 方法等,带来直观清晰的学习体验。通过掌握路径操作装饰器的使用及 Uvicorn 的启动配置,你将能快速构建出强大、可靠的 Python Web 应用,夯实高效 API 开发的基础。

文章目录

  • FastAPI 核心概念:构建高性能的 Python Web 服务
      • 一 简单的 FastAPI 应用示例
      • 二 自定义 FastAPI 的实例对象
      • 三 自定义 uvicorn 启动
      • 四 术语
        • 1 路径
        • 2 操作
      • 五 定义一个路径操作装饰器
        • 1 装饰器
        • 2 解释说明
      • 六 返回内容
      • 七 完整代码示例
      • 八 源码地址

一 简单的 FastAPI 应用示例

# 从fastapi库导入FastAPI类,用于创建FastAPI应用实例
from fastapi import FastAPI# 创建一个FastAPI应用实例,app将作为应用的入口
app = FastAPI()# 使用@app.get("/")装饰器定义一个GET请求的路由
# 当用户访问根路径 ("/") 时,FastAPI会调用下面的函数
@app.get("/")
async def root():# 定义返回的响应内容,这里返回一个JSON对象 {"message": "Hello World"}return {"message": "Hello World"}

FastAPI 是一个为 API 提供功能的 Python 类,直接从 Starlette 继承。可以通过 FastAPI 使用所有 Starlette 的功能。app 同样会被 uvicorn 所引用。

$ uvicorn main:app --reload

注释:

uvicorn main:app 命令含义如下:

  • mainmain.py 文件(Python 模块)。
  • app:在 main.py 文件中通过 app = FastAPI() 创建的对象。
  • --reload:让服务器在更新代码后重新启动,仅在开发时使用该选项。

二 自定义 FastAPI 的实例对象

from fastapi import FastAPI# FastAPI 的实例对象
my_awesome_api = FastAPI()@my_awesome_api.get("/")
async def root():return {"message": "Hello World"}

自定义 my_awesome_api 对象,将 app 改为 my_awesome_api,对应的装饰器也改为 @my_awesome_api

三 自定义 uvicorn 启动

将代码放入 main.py 文件中,然后可以像下面这样运行 uvicorn

$ uvicorn main:my_awesome_api --reloadINFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)

如果代码放入了 chapter01.py 文件中,可以像下面运行 uvicorn

$ uvicorn chapter01:my_awesome_api --reload

四 术语

1 路径

路径:也称为端点或路由,指的是 URL 中从第一个 / 起的部分。例如,URL https://example.com/items/foo 的路径是 /items/foo。开发 API 时,路径用于分离 关注点资源

2 操作

操作:指的是一种 HTTP 方法。

常见操作少见操作
POSTOPTIONS
GETHEAD
PUTPATCH
DELETETRACE

在 HTTP 协议中,可以使用上述方法之一(或多种)与每个路径进行通信。在开发 API 时,可以使用特定的 HTTP 方法执行特定行为。

HTTP 方法特定行为
POST创建数据
GET读取数据
PUT更新数据
DELETE删除数据

五 定义一个路径操作装饰器

from fastapi import FastAPIapp = FastAPI()# 一个路径操作装饰器
@app.get("/")
async def root():return {"message": "Hello World"}

@app.get("/") 告诉 FastAPI 下方的函数负责处理如下访问请求:

  • 请求路径为 /
  • 使用 GET 操作
1 装饰器

@decorator 语法在 Python 中被称为 装饰器装饰器 告诉 FastAPI 下方的函数对应着 路径 / 加上 GET 操作,是一个 路径操作装饰器。FastAPI 中的装饰器对应 HTTP 方法如下:

路径操作装饰器HTTP 方法
@app.get()GET
@app.post()POST
@app.put()PUT
@app.delete()DELETE
@app.options()OPTIONS
@app.head()HEAD
@app.patch()PATCH
@app.trace()TRACE

FastAPI 没有强制要求操作有任何特定含义,可以随意使用任何操作(HTTP 方法),但一般在实际项目中习惯使用 GET/POST。

2 解释说明

这是一个路径操作函数:

  • 路径/
  • 操作GET
  • 函数:位于装饰器下方的函数
from fastapi import FastAPIapp = FastAPI()@app.get("/")
async def root():return {"message": "Hello World"}

这是一个 Python 函数,每当 FastAPI 接收一个使用 GET 方法访问 URL / 的请求时,该函数会被调用。在这个例子中,这是一个 async 函数,也可以将其定义成常规函数而不使用 async def

from fastapi import FastAPIapp = FastAPI()@app.get("/")
def root():return {"message": "Hello World"}

有关 async defdef 的更多信息可以查看 官方文档 。

六 返回内容

from fastapi import FastAPIapp = FastAPI()@app.get("/")
async def root():return {"message": "Hello World"}

可以返回 dictlist,或者单个值,如 strint 等。当前示例返回 JSON

七 完整代码示例

from fastapi import FastAPI# 启动命令:uvicorn chapter01:app --reload 
app = FastAPI()@app.get("/")
async def root():return {"message": "Hello World! app"}# 启动命令:uvicorn chapter01:my_awesome_api --reload 
my_awesome_api = FastAPI()@my_awesome_api.get("/")
async def root():return {"message": "Hello World!my_awesome_api"}

八 源码地址

详情见:GitHub FastApiProj

引用: FastAPI 文档

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

气膜冰雪项目:推动冰雪运动发展的新纪元—轻空间

随着2024年北京冬奥会的余温仍在延续,气膜冰雪项目在我国的冰雪运动发展中扮演着愈发重要的角色。气膜结构以其独特的优势,正吸引着越来越多的参与者,推动着冰雪运动的普及与发展。 突出的优势 气膜冰雪馆的设计理念充分体现了现代建筑的灵活…

市场分化!汽车零部件「变天」

全球汽车市场的动荡不安,还在持续。 本周,全球TOP20汽车零部件公司—安波福(Aptiv)发布2024年第三季度财报显示,三季度公司经调整后确认收入同比下降6%;按照区域市场来看,也几乎是清一色的下滑景…

ES6中数组新增了哪些扩展?

ES6中数组新增了哪些扩展? 1、扩展运算符的应⽤ ES6通过扩展元素符 … ,好⽐ rest 参数的逆运算,将⼀个数组转为⽤逗号分隔的参数序列 console.log(...[1, 2, 3]) // 1 2 3 3 console.log(1, ...[2, 3, 4], 5) // 1 2 3 4 5 [...documen…

基于物联网的户外环境检测装置教学文章

引言 随着物联网(IoT)技术的发展,越来越多的应用被广泛研究和应用于我们的日常生活中。户外环境检测装置是一种利用传感器、网络连接和数据分析技术,监测和分析环境数据(如温度、湿度、空气质量等)的设备。…

ubuntu20安装opencv3.2记录

系统环境 ubuntu20安装了ros-noetic,所以系统默认装了opencv4.2.0,但是跑fastlivo推荐的是opencv3.2.0,而且海康相机别人写的ros驱动(海康相机ros驱动)也是需要opencv3.2.0,最终还是选择安装多版本的openc…

全!新!LLM推理加速调研

本文主要内容 介绍一篇大模型推理加速综述论文,简单说明了LLM推理加速的基本内容。 介绍了推理阶段的prefilling(主要方向:计算优化)和decoding(主要方向:内存优化)差异。 prefilling优化方面…

大数据-206 数据挖掘 机器学习理论 - 多元线性回归 回归算法实现 算法评估指标

点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…

Python+Appium+Pytest+Allure自动化测试框架-安装篇

文章目录 安装安装ADT安装NodeJs安装python安装appium安装Appium Server(可选)安装Appium-Inspector(可选)安装allure安装pytest PythonAppiumPytestAllure框架的安装 Appium是一个开源工具,是跨平台的,用于…

Nature Methods | 新型三维光场显微成像技术

欢迎关注GZH《光场视觉》 近日,中科院脑科学与智能技术卓越创新中心王凯研究组在《自然方法》(Nature Methods)上,在线发表了题为Volumetric Voltage Imaging of Neuronal Populations in Mouse Brain by Confocal Light Field M…

深度学习基础—循环神经网络的梯度消失与解决

引言 深度学习基础—循环神经网络(RNN)https://blog.csdn.net/sniper_fandc/article/details/143417972?fromshareblogdetail&sharetypeblogdetail&sharerId143417972&sharereferPC&sharesourcesniper_fandc&sharefromfrom_link深…

基于向量检索的RAG大模型

一、什么是向量 向量是一种有大小和方向的数学对象。它可以表示为从一个点到另一个点的有向线段。例如,二维空间中的向量可以表示为 (𝑥,𝑦) ,表示从原点 (0,0)到点 (𝑥,𝑦)的有向线段。 1.1、文本向量 1…

Bartender 5 for Mac 菜单栏管理软件 安装教程【保姆级教程,操作简单小白轻松上手使用】

Mac分享吧 文章目录 Bartender 5 for Mac 菜单栏管理软件 安装完成,软件打开效果一、Bartender 5 菜单栏管理软件 Mac电脑版——v5.2.3⚠️注意事项:1️⃣:下载软件2️⃣:安装软件3️⃣:打开软件,根据自己…

国产操作系统重新安装软件商店

国产操作系统类似于手机的“应用商店”,都会有一个“软件商店”,方便用户安装管理电脑的软件。这个软件商店不仅有各种软件,还有各类外设驱动和移动应用环境模拟功能。软件商店可以下载安装软件,还可以更新、卸载软件。 软件商店 …

FastAPI中如果async def和def 路由的区别

在python的整体生态中,虽然已经有很多库支持了异步调用,如可以使用httpx或者aiohttp代替requests库发起http请求,使用asyncio.sleep 代替time.sleep, 但是依然还有很多优秀的第三方库是不支持异步调用也没有可代替的库&#xff0c…

Pinctrl子系统中Pincontroller和client驱动程序的编写

往期内容 本专栏往期内容: Pinctrl子系统和其主要结构体引入Pinctrl子系统pinctrl_desc结构体进一步介绍Pinctrl子系统中client端设备树相关数据结构介绍和解析inctrl子系统中Pincontroller构造过程驱动分析:imx_pinctrl_soc_info结构体Pinctrl子系统中c…

【C++动态规划】2435. 矩阵中和能被 K 整除的路径|1951

本文涉及知识点 C动态规划 LeetCode2435. 矩阵中和能被 K 整除的路径 给你一个下标从 0 开始的 m x n 整数矩阵 grid 和一个整数 k 。你从起点 (0, 0) 出发,每一步只能往 下 或者往 右 ,你想要到达终点 (m - 1, n - 1) 。 请你返回路径和能被 k 整除的…

【QT】Qt对话框

个人主页~ Qt窗口属性~ Qt窗口 五、对话框2、Qt内置对话框(1)Message Box(2)QColorDialog(3)QFileDialog(4)QFontDialog(5)QInputDialog 五、对话框 2、Qt内…

视频推荐的算法(字节青训)

题目: 西瓜视频 正在开发一个新功能,旨在将访问量达到80百分位数以上的视频展示在首页的推荐列表中。实现一个程序,计算给定数据中的80百分位数。 例如:假设有一个包含从1到100的整数数组,80百分位数的值为80&#…

线程基础知识、jmm(Java内存模型)

目录 线程基础知识 并发与并行 进程和线程 线程优先级 创建线程的方式主要有三种 休眠 作出让步 join() 方法 线程协作注意什么 理解线程状态 选择合适的协作工具 共享资源的访问控制 避免竞争条件 创建线程几种方式 线程状态,状态之间切换 新建&…

2.数组越界访问如何调试HardFault错误

数组越界 在项目开发过程中,配置串口外设是一个常见的任务,但在实际操作中,我们可能会遇到一些预料之外的问题。例如,在调试过程中,我们发现单片机只接受了一次数据后便不再接收,这无疑是一个棘手的问题。…