FastAPI 学习笔记

FastAPI 学习笔记

  • 0. 引言
  • 1. 快速开始
  • 2. 升级示例代码

0. 引言

在 Python 这个充满活力的生态系统中,FastAPI 应运而生,它是一个现代的、快速的 Web 框架,专注于构建 RESTful API。

无论你是一名有经验的 Python 开发人员,还是一名刚接触后端开发的新手,FastAPI 都值得一试。凭借其基于 ASGI 的异步特性、自动交互式文档、数据模型验证等优秀功能,FastAPI 让构建和维护 API 变得前所未有的高效和愉悦。

在这篇博客中,我们将一步步探索 FastAPI 的精华。从安装到项目搭建,从数据模型定义到路由处理,从中间件应用到数据库集成,无一幸免。我们还将学习如何结合 FastAPI 生态系统中的其他精彩库,打造功能丰富、高性能的 API 应用。无论你是想构建一个小巧的 API 还是开发一个复杂的企业级系统,FastAPI 都是不可多得的利器。

就让我们拥抱令人兴奋的 FastAPI,开启一段 Python Web 开发的新篇章吧!

1. 快速开始

安装 FastAPI 库,

pip install fastapi

也需要一个 ASGI 服务器,比如 Uvicorn 或 Hypercorn,用于生产环境。

pip install "uvicorn[standard]"

创建一个 main.py 文件,

from typing import Unionfrom fastapi import FastAPIapp = FastAPI()@app.get("/")
def read_root():return {"Hello": "World"}@app.get("/items/{item_id}")
def read_item(item_id: int, q: Union[str, None] = None):return {"item_id": item_id, "q": q}

如何想使用异步,

from typing import Unionfrom fastapi import FastAPIapp = FastAPI()@app.get("/")
async def read_root():return {"Hello": "World"}@app.get("/items/{item_id}")
async def read_item(item_id: int, q: Union[str, None] = None):return {"item_id": item_id, "q": q}

运行,

uvicorn main:app --reload

关于命令 uvicorn main:app --reload 的解释如下:
main: 指的是主 Python 文件 main.py(“模块”)。
app: 指的是在 main.py 内部通过 app = FastAPI() 创建的对象。
–reload: 代码变更后重启服务器,仅在开发时使用。

打开你的浏览器,访问 http://127.0.0.1:8000/items/5?q=somequery。

你将看到以下 JSON 响应:

{"item_id": 5, "q": "somequery"}

你已经创建了一个 API,它:

  • 接收发送到 路径 //items/{item_id} 的 HTTP 请求。
  • 这两个 路径 接受 GET 操作 (也称为 HTTP 方法)。
  • 路径 /items/{item_id} 有一个必须为 int 类型的 路径参数 item_id
  • 路径 /items/{item_id} 有一个可选的 str 类型的 查询参数 q

现在访问 http://127.0.0.1:8000/docs,

你会看到自动生成的交互式API文档(由Swagger UI提供):

在这里插入图片描述

2. 升级示例代码

将文件 main.py 修改为接收来自 PUT 请求的请求体。

使用 Pydantic 以标准 Python 类型声明请求体。

from typing import Unionfrom fastapi import FastAPI
from pydantic import BaseModelapp = FastAPI()class Item(BaseModel):name: strprice: floatis_offer: Union[bool, None] = None@app.get("/")
def read_root():return {"Hello": "World"}@app.get("/items/{item_id}")
def read_item(item_id: int, q: Union[str, None] = None):return {"item_id": item_id, "q": q}@app.put("/items/{item_id}")
def update_item(item_id: int, item: Item):return {"item_name": item.name, "item_id": item_id}

服务器应该会自动重新加载(因为您在上面的 uvicorn 命令中添加了 --reload)。

现在访问 http://127.0.0.1:8000/docs。

  • 交互式API文档将会自动更新,包括新的请求体部分。

在这里插入图片描述

  • 单击"Try it out"按钮,它允许您填写参数并直接与API进行交互:

在这里插入图片描述

  • 然后点击"Execute"按钮,用户界面将与您的API进行通信,发送参数,获取结果并将其显示在屏幕上:

在这里插入图片描述

FastAPI Documentation: https://fastapi.tiangolo.com

FastAPI Source Code: https://github.com/tiangolo/fastapi

未完待续!

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

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

相关文章

MyBatis注解开发详解

MyBatis注解开发详解 一、前言 MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis免除了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解来配置和映射原始类型、接口和Java POJO(Plain…

HTTP/2、HTTP/3对HTTP/1.1的性能改进和优化

HTTP/1.1 相比 HTTP/1.0 提高了什么性能? 性能上的改进: 使用长连接的方式改善了 HTTP/1.0 短连接造成的性能开销。 支持管道(pipeline)网络传输,只要第一个请求发出去了,不必等其回来,就可以…

Purple Pi OH鸿蒙开发板7天入门OpenHarmony开源鸿蒙教程【五】

在完成了Purple Pi OH大部分的接口测试之后,紧接着就是一个充满挑战的任务——利用SDK来编译生成我们自己的镜像文件。通过这一过程,不仅能够让你获得一个可在真实硬件上运行的系统镜像,更重要的是,它让你对OpenHarmony系统的构建…

C++中的内存管理方式

一、C内存管理方式简介 C语言中的内存管理方式在C中可以继续使用,但是在有些地方就无能为力,而且使用起来比较麻烦。因此C中引入了自己的内存管理方式,通过new和delete操作符进行动态内存管理。 二、new语法 new可以申请1个或多个空间&…

Android自定义binder实现进程间通信

通过binder建立进程间通信,主要分为两步: 1. 定义一个binder的服务(在androidManifest.xml中声明)接受远端请求。 服务中创建一个binder实例, 在接收到客户端的连接时,向请求方返回回binder的引用。重写Bi…

Qt - 信号和槽

目录 一、信号 二、槽 三、信号和槽的使用 (一) 连接信号和槽 (二) 自定义槽 (三) 通过 Qt Creator生成信号槽代码 (四) 自定义信号 四、带参数的信号和槽 五、信号与槽的断开 六、Qt4版本信号与槽的连接 (一) Qt4版本信号与槽连接的优缺点 一、信号 在 Qt 中&…

【简单模拟】第十二届蓝桥杯省赛第二场C++ B组《特殊年份》(C++)

【题目描述】 今年是 2021 年,2021 这个数字非常特殊,它的千位和十位相等,个位比百位大 1,我们称满足这样条件的年份为特殊年份。 输入 5 个年份,请计算这里面有多少个特殊年份。 【输入格式】 输入 5 行&#xff…

​Ubuntu20.04 创建新的用户​

1、了解Linux目录结构 推荐看一下:https://www.runoob.com/linux/linux-system-contents.html Linux支持多个用户进行操作的,这样提高了系统的安全性,也可以多人共用一个系统,不过要注意的是系统中安装的软件相关路径&#xff0…

CubeMX使用教程(5)——定时器PWM输出

本篇我们将利用CubeMX产生频率固定、占空比可调的两路PWM信号输出 例如PA6引脚输出100Hz的PWM;PA7引脚输出500Hz的PWM,双路同时输出 我们还是利用上一章定时器中断的工程进行学习,这样比较方便 首先打开CubeMX对PA6、PA7进行GPIO配置 注&a…

Mixamo动画素材导入UE5的最简单方法

一、Mixamo素材 官网:https://www.mixamo.com/ Mixamo是Adobe公司出品的免费动画库,可商用。软件分为characters(角色)、Animations(动画)两个部分。 二、辅助工具MIXAMO CONVERTER 官网:https://terribilisstudio…

Android中MultiDex优化

MultiDex基本思路 当一个Dex文件太肥的时候(方法数目太多、文件太大),在打包或在安装或运行apk也会出问题。 解决方法就是将这个硕大的Dex文件拆分成若干个小的Dex文件。 刚好一个ClassLoader可以有多个DexFile。 MultiDex主要性能瓶颈 解压缩和Dex优化(…

架构师面试问与答

你如何评估和选择合适的分布式缓存方案以提高系统性能? 我会考虑使用分布式缓存系统,如Redis、Memcached等,并根据系统需求和负载情况选择合适的缓存方案。 请简要描述一下你对服务发现和服务注册的理解以及在软件架构中的应用。 服务发现和…

SplitFunctions (BOLT) - 优化阅读笔记

将函数拆分成更小的代码片段,从而执行更激进的代码段重排的优化 在文件 bolt/lib/Passes/SplitFunctions.cpp 相关选项释义默认-split-all-cold尽可能多的分离冷的基本块false-split-align-threshold对齐参数2-split-functions主要功能选项, 分离函数到代码片段fa…

Codeql复现CVE-2018-11776学习笔记

基本使用 1、首先下载struts2漏洞版本源码: https://codeload.github.com/apache/struts/zip/refs/tags/STRUTS_2_3_20 2、构建codeql数据库(构建失败文末有解决办法): codeql database create ~/CodeQL/databases/struts2-2.3.…

C#与WPF通用类库

个人集成封装,仓库已公开 NetHelper 集成了一些常用的方法; 如通用的缓存静态操作类、常用的Wpf的ValueConverters、内置的委托类型、通用的反射加载dll操作类、Wpf的ViewModel、Command、Navigation、Messenger、部分常用UserControls(可绑定的Passwo…

通信总线协议之CAN-FD协议详解

文章目录 通信总线之CAN-FD总线协议详解1. CAN-FD 简介1.1 什么是CAN FD1.2 CAN FD的特点 2. CAN-FD总线协议2.1 帧起始2.2 仲裁段2.3 控制段2.4 数据段2.5 CRC段2.6 ACK段2.7 帧结束 3. 如何从传统的CAN升级到CAN FD 通信总线之CAN-FD总线协议详解 1. CAN-FD 简介 1.1 什么是…

selenium高级应用

常见控件应用 复杂的控件操作1.操作Ajax选项2.滑动滑块操作 WebDriver的特殊操作元素class值包含空格property、attribute、text的区别定位动态id 截图功能页面截图页面截图,返回截图的二进制数据页面截图,返回base64的字符串截取指定元素。先定位元素&a…

Vue3:toRef和toRefs的用法

一、情景说明 我们知道,Vue3中想要定义对象类型的响应式数据 可以通过reactive函数实现 如果,后端返回的对象,有很多的字段,我们想进行结构化赋值 但是,又想保证赋值后的变量也是响应式数据 那么,这个时候…

算法进阶之路:十大经典排序算法详解与实践

算法进阶之路:十大经典排序算法详解与实践 在计算机科学的世界里,排序算法是基础且至关重要的一环。无论是数据库查询、数据分析还是日常的编程任务,高效的排序算法都能显著提升程序的性能。本文将带你深入了解十大经典排序算法,…

BeyondCompared4提示“缺少评估信息或损坏”修复

BeyondCompared4提示“缺少评估信息或损坏”修复 使用 beyond compare4,在安装的30天后,出现“缺少评估信息”、“评估信息损坏”的提示 解决方法如下(Win11下亲测可行) 按 WinR 进入 打开Windows命令运行框,输入cmd …