Python从入门到精通1:FastAPI
引言
在现代 Web 开发中,API 是前后端分离架构的核心。FastAPI 凭借其高性能、简洁的语法和自动文档生成功能,成为 Python 开发者的首选框架。本文将从零开始,详细讲解 FastAPI 的核心概念、安装配置、路由设计、请求处理以及实际应用案例,助你快速掌握这一高效工具。
一、FastAPI 概述与安装
1.1 什么是 FastAPI?
FastAPI 是一个基于 Python 3.8+ 的现代 Web 框架,专注于构建高性能 RESTful API。其核心特点包括:
- 基于 Starlette 和 Pydantic:提供异步支持和严格的数据验证。
- 自动生成 API 文档:内置 Swagger UI 和 ReDoc,开发者无需手动维护文档。
- 类型提示(Type Hints):利用 Python 的类型系统实现输入参数验证和代码提示。
1.2 FastAPI 的优势
特性 | 说明 |
---|---|
高性能 | 异步处理能力(ASGI)支持高并发,性能媲美 Node.js 和 Go。 |
开发效率高 | 通过类型提示和自动文档生成,减少代码冗余和调试时间。 |
生态完善 | 可无缝集成 SQLAlchemy、OAuth2、JWT 等常用库。 |
1.3 安装与环境配置及第一个FastApi应用
1.3.1、安装与环境配置
步骤 1:安装依赖库
pip install fastapi # FastAPI 依赖 Python 3.8 及更⾼版本
步骤 1:安装uvicorn服务器
pip install "uvicorn[standard]" # 安装 ASGI 服务器
1.3.2、第一个FastApi应用
创建 test_one.py:
from fastapi import FastAPI # 导⼊FastAPI,⽤于定义APIapp = FastAPI() # 创建FastAPI实例# http请求方式类型:get、post、put、update、delete
# 浏览器默认访问的是get类型,如果使用其他形式访问
# 出现405的提示(请求的方式不匹配)# 不带参数的访问形式:
# 访问地址:http://127.0.0.1:8000
@app.get("/")
async def test_one():return {"message": "My first fastapi project"}# 带一个参数的时候的访问形式:
# 访问地址:http://127.0.0.1:8000/hello/小宁
@app.get("/hello/{name}")
async def hello(name: str):return {"hello": f"fastapi {name}"}# 带一个参数的时候的访问形式:
# 访问地址:http://127.0.0.1:8000/my/小宁,21/长沙
@app.get("/my/{name},{age}/{addr}")
async def test_one(name: str, age: int, addr: str):return {"name": name, "age": age, "addr": addr}
启动uvicorn服务器:
# 在Terminal中输入:
# 语法:uvicorn 文件的相对路径:实例名 --reload
# reload:表示热启动,后端代码改变时,前端页面也会随之改变
uvicorn csdn.test_one:app --reload
运行结果:
注意事项:
1、传入参数的时候不能多传,也不能少传。
2、传入的参数一定要满足自己设置的http网址的层级格式。
3、传入的参数要满足函数设置的参数类型。
二、快速入门案例解析
2.1、union的可选参数
创建 test_two.py:
from typing import Union # 导⼊Union, ⽤于定义可选类型
from fastapi import FastAPI # 导⼊FastAPI,⽤于构建RESTful APIapp = FastAPI()# 创建FastAPI实例# 访问地址:http://127.0.0.1:8000/items/100?q=小宁
@app.get("/items/{item_id}")
# 定义路由,访问根路径调⽤read_item函数,传⼊item_id参数,并返回该参数对应的数据
# q: Union[str, None] = None ⽤于定义q的可选类型为str或int或None
# 如果http没有传入参数时候,默认为None,避免用户没传入参数,网页就跑不出来的情况
async def read_item(item_id: int, q: Union[str,int, None] = None):return {"item_id": item_id, "q": q}
代码解析
- 路径参数:
{item_id}
动态匹配 URL 中的值,自动转换为整数类型。 - 查询参数:
q
通过Union[str, None]
声明为可选参数。 - 自动验证:若传入非整数
item_id
,FastAPI 返回 HTTP 422 错误。
启动uvicorn服务器:
uvicorn csdn.test_two:app --reload
运行结果:
2.2、uvicorn.run和pydantic类结合Apifox
在前面的课堂案例中,我们启动服务器都要打开终端Timinal中输入启动服务器的语句,那么每次启动都要输出启动的语句,那就很麻烦了,有没有什么办法可以要启动服务器和和之前一样只要点击运行就能够启动呢?所以我们接下来就会讲到uvicorn.run启动服务器。
在前面的内容我们讲过,浏览器默认的请求方式是get,那么假如我们的http请求方式是post等其他类型的时候怎么办呢,那么就需要使用Apifox软件了,这个大家可以直接官网直接下载。
创建 test_three.py:
from fastapi import FastAPI # 引⼊FastAPI类,⽤于创建⼀个应⽤ import uvicorn # 引⼊uvicorn,⽤于启动服务 from typing import Union #引⼊Union类,⽤于类型注解 from pydantic import BaseModel # 引⼊pydantic类,⽤于定义数据结构app = FastAPI() # 创建⼀个应⽤,app是⼀个FastAPI实例class Item(BaseModel):# 定义⼀个Item类,继承⾃BaseModel,⽤于定义请求体中的数据结构# 定义⼀个name属性,类型为strname: str# 定义⼀个price属性,类型为floatprice: float# 定义⼀个is_offer属性,类型为Union[bool, None],默认为Noneis_offer:Union[bool, None] = None@app.get("/") # 装饰器,表示定义⼀个根路径的get请求 # 定义⼀个根路径的get请求,返回⼀个字典,键值分别为Hello和World # async 表示异步请求,可以提⾼性能 # 测试访问:http://127.0.0.1:8000/ async def read_root():return {"Hello": "World"}@app.get("/items/{item_id}") # 定义⼀个路径参数为item_id的get请求,返回⼀个字典,键值分别为item_id和q # Union[str, None] 表示q可以为str类型或者None类型,默认为None # 测试访问:http://127.0.0.1:8000/items/3?q=abc async def read_item(item_id: int, q: Union[str, None] = None):return {"item_id": item_id, "q": q}@app.put("/items/{item_id}") # 测试访问:http://127.0.0.1:8000/items/3 async def update_item(item_id: int, item:Item):# 定义⼀个路径参数为item_id的put请求,返回⼀个字典,键值分别为item_name和item_idreturn {"item_name": item.name, "item_id": item_id,"item_price": item.price,"is_offer": item.is_offer} # Item类类型传参数的时候要使用apidox中的body中的json格式(字典格式)if __name__ == "__main__":# 启停⽅式:# 1.⽅式1指令式:# 服务器启动指令 uvicorn main:app --reload# fastDemo1:app 表示main.py⽂件中的app实例# 服务器停⽌指令 ctrl+c# 2.⽅式2界⾯式:# ⿏标右键启动----》run main.py# 界⾯右上⻆的停⽌按钮# 启动服务,host指定主机地址,port指定端⼝号,reload=True表示当代码发⽣变化时,⾃动重启服务# main:app---- 表示main.py⽂件中的app实例uvicorn.run("bbb:app", host="127.0.0.1", port=8080, reload=True)
运行结果:
这里是Apifox的操作截图:
三、路由分发
3.1、为什么需要路由分发?
在小型项目中,所有路由都写在 main.py
中尚可接受。但随着项目规模扩大(如构建包含用户、订单、商品等多个模块的电商系统),将所有路由集中在一个文件会导致:
- 代码臃肿:数千行代码堆积,难以阅读和维护。
- 协作困难:多人同时修改同一文件容易引发冲突。
- 复用性差:相同功能的路由无法快速移植到其他项目。
路由分发(Route Distribution)通过 模块化拆分路由,将不同功能的路由分散到多个文件中,最终通过统一入口集成,完美解决上述问题。
3.2、图书管理系统
# 出版社分发路由配置
from fastapi import APIRouterapi_cbs = APIRouter()@api_cbs.get("/get")
async def get_test():return {"methods": "出版社分发路由get方法"}@api_cbs.post("/post")
async def post_test():return {"methods": "出版社分发路由post方法"}@api_cbs.put("/put")
async def put_test():return {"methods": "出版社分发路由put方法"}@api_cbs.delete("/delete")
async def delete_test():return {"methods": "出版社分发路由delete方法"}
# 图书分发路由配置
from fastapi import APIRouterapi_ts = APIRouter() # 创建路由@api_ts.get("/get")
async def get_test():return {"methods": "图书分发路由get⽅法"}@api_ts.post("/post")
async def post_test():return {"methods": "图书分发路由post⽅法"}@api_ts.put("/put")
async def put_test():return {"methods": "图书分发路由put⽅法"}@api_ts.delete("/delete")
async def delete_test():return {"methods": "图书分发路由delete⽅法"}
zz源码
# 图书分发路由配置
from fastapi import APIRouterapi_ts = APIRouter() # 创建路由@api_ts.get("/get")
async def get_test():return {"methods": "图书分发路由get⽅法"}@api_ts.post("/post")
async def post_test():return {"methods": "图书分发路由post⽅法"}@api_ts.put("/put")
async def put_test():return {"methods": "图书分发路由put⽅法"}@api_ts.delete("/delete")
async def delete_test():return {"methods": "图书分发路由delete⽅法"}
main源码
from fastapi import FastAPI
from csdn.ts import api_ts
from csdn.cbs import api_cbs
from csdn.zz import api_zz
app = FastAPI()#include_router()⽅法,⽤于将分发路由添加到app中,prefix参数为路由前缀,tags参数为标签
app.include_router(api_ts, prefix="/ts", tags=["图书"])
app.include_router(api_cbs, prefix="/cbs", tags=["出版社"])
app.include_router(api_zz, prefix="/zz", tags=["作者"])
运行结果:
提示:其他的需要访问的时候要使用Apifox来访问,因为其他的http的请求方式都不是get不能使用浏览器直接访问。
四、request对象的入门

代码示例:
from fastapi import FastAPI,Request
@app.put("/req/")
async def req(request: Request):req_method = request.method #请求的方式req_url = request.base_url # 请求的路径req_port = request.url.port #请求的端口res_json = request.json() # 请求json数据res_arg1 = request.url.query # 请求查询参数1res_arg2 = request.query_params # 请求查询参数2print(f"请求的方式:{req_method},请求的路径:{req_url},#请求的端口:{req_port},请求json数据:{res_json}"f"请求查询参数1:{res_arg1},请求查询参数2:{res_arg2}")
在Aifox中发送请求:
参数:
json参数:
运行结果:
五、总结
FastAPI 凭借其高性能和开发效率,已成为构建现代 API 的首选框架。通过本文的学习,你已经掌握了:
- 基础路由设计与参数验证
- 模块化路由管理(APIRouter)
- 请求元数据处理(Request 对象)
- 异步编程与高级功能
- 常见的http状态码提示的意思:
200:请求成功的状态码404:页面找不到422:请求体中数据有问题(格式不正确,名字匹配不对)405:请求的方式不匹配(如路径是get形式,但是函数上面写的是其他的请求类型)500:后台服务器程序出错d
无论是构建微服务、实时应用还是数据处理接口,FastAPI 都能提供强大的支持。下一步可探索其与 SQL 数据库、WebSocket 或分布式任务队列的集成,进一步提升项目复杂度。
延伸阅读
- 官方文档:FastAPI Documentation
- 实战项目:FastAPI + SQLAlchemy 用户管理系统
相关文章:

Python从入门到精通1:FastAPI
引言 在现代 Web 开发中,API 是前后端分离架构的核心。FastAPI 凭借其高性能、简洁的语法和自动文档生成功能,成为 Python 开发者的首选框架。本文将从零开始,详细讲解 FastAPI 的核心概念、安装配置、路由设计、请求处理以及实际应用案例&a…...

fastapi+angular停车管理系统可跨域
说明: 我计划用fastapiangular做一款停车管理系统,支持跨域 1.设计mysql数据库表, 2.建表,添加测试数据,多表查询, 3.在fastapi写接口查询数据, 4.用postman测试, 5.在angular前端展…...
前端题目类型
HTMLCSS常见面试题 HTML标签有哪些行内元素 img、picture、span、input、textarea、select、label 说说你对元素语义化的理解 元素语义化就是用正确的元素做正确的事情。虽然理论上所有html元素都可通过css样式实现相同效果,但这样会使事情复杂化,所以需…...
openwrt路由系统------lua、uci的关系
1. Luci 的核心组成 (1) Lua 简介:Luci 的界面和逻辑几乎完全使用 Lua 脚本语言编写。Lua 是一种轻量级、高效的嵌入式脚本语言,适合在资源受限的路由器环境中运行。作用: 生成动态 Web 页面(与后端交互渲染 HTML)。处理用户提交的表单数据(如修改 Wi-Fi 密码)。调用系…...

Elastic:AI 会开始取代网络安全工作吗?
作者:来自 Elastic Joe DeFever 不会,但它正在从根本上改变这些工作。 生成式 AI (GenAI) 正迅速成为日常安全工作流程中的一个重要组成部分。那么,它是合作伙伴还是竞争对手? GenAI 技术在安全堆栈几乎每个方面的广泛应用&#…...

Linux安装升级docker
Linux 安装升级docker Linux 安装升级docker背景升级停止docker服务备份原docker数据目录移除旧版本docker安装docker ce恢复数据目录启动docker参考 安装找到docker官网找到docker文档删除旧版本docker配置docker yum源参考官网继续安装docker设置开机自启配置加速测试 Linux …...

【经验分享】Ubuntu20.04编译RK3568 AI模型报错问题(已解决)
【经验分享】Ubuntu20.04编译RK3568 AI模型报错问题(已解决) 前言问题现象问题分析解决方案总结 前言 这里使用的是Rockchip提供的rknn_model_zoo,https://github.com/airockchip/rknn_model_zoo/tree/main 此解决方案适用于Rockchip芯片在U…...

国产算力助力工业智能新范式
随着人工智能、智能制造以及边缘计算等技术趋势的发展,算力设备正逐渐从中心云向边缘机房乃至边缘现场下沉。在此背景下,以工控机为例的部署于各类边缘现场的算力设备市场,也正面临着新的变革。 根据IDC 2024研究报告显示:在能源制…...
学习笔记:利用OpenAI实现阅卷智能体
https://zhuanlan.zhihu.com/p/18047953492 ### 学习笔记:利用OpenAI实现阅卷智能体 #### 一、背景与需求 在各类考试中,选择题、判断题、填空题的阅卷相对简单,只需对比答案与作答是否一致。然而,简答题的阅卷较为复杂ÿ…...
第6届传智杯复赛第一场
A小红劈字符串 题目链接 题目链接:A-小红劈字符串(B组)_第6届传智杯复赛第一场(补题) (nowcoder.com) 题目描述 小红拿到了一个仅由小写字母组成的字符串,她希望将其分割成两个非空子串,使得第…...

CSDN博客:Markdown编辑语法教程总结教程(中)
❤个人主页:折枝寄北的博客 Markdown编辑语法教程总结 前言1. 列表1.1 无序列表1.2 有序列表1.3 待办事项列表1.4 自定义列表 2. 图片2.1 直接插入图片2.2 插入带尺寸的图片2.3 插入宽度确定,高度等比例的图片2.4 插入高度确定宽度等比例的图片2.5 插入居…...
Codeforces Round 258 (Div. 2) E. Devu and Flowers 生成函数
题目链接 题目大意 有 n n n ( 1 ≤ n ≤ 20 ) (1\leq n \leq 20) (1≤n≤20) 个花瓶,第 i i i 个花瓶里有 f i f_i fi ( 1 ≤ f i ≤ 1 0 12 ) (1\leq f_i \leq 10^{12}) (1≤fi≤1012) 朵花。现在要选择 s s s ( 1 ≤ s ≤ 1 0 14 ) (1\leq s \leq 1…...

【高并发内存池】释放内存 + 申请和释放总结
高并发内存池 1. 释放内存1.1 thread cache1.2 central cache1.3 page cache 2. 申请和释放剩余补充 点赞👍👍收藏🌟🌟关注💖💖 你的支持是对我最大的鼓励,我们一起努力吧!😃&#x…...

AutoGen学习笔记系列(九)Advanced - Selector Group Chat
这篇文章瞄的是AutoGen官方教学文档 Advanced 章节中的 Selector Group Chat 篇章,介绍了SelectorGroupChat对象如何从一个Team中选择其中一个Agent与LLM进行对话,并且在得到结果后进行二次规划,同时你也可以自定义选择函数。本质上还是对Tea…...
Stream特性(踩坑):惰性执行、不修改原始数据源
在日常开发中,Stream API 提供了一种高效且易于使用的工具集来处理集合数据。 本文主要讲解 Stream 的两个特性:惰性执行,不修改原始数据源。 为什么说这两个、而不讲下其他的特性呢?主要是因为在开发中如果忽略这两个特性的话&…...

springcloud sentinel教程
QPS(Queries Per Second)即每秒查询率 TPS,每秒处理的事务数目 PV(page view)即页面浏览量 UV 访问数(Unique Visitor)指独立访客访问数 一、初识Sentinel 什么是雪崩问题? 微服务之间相…...

像素的一生 Life of a Pixel - Steve Kobes 2020版
像素的一生 Life of a Pixel - Steve Kobes 2020版 《Life of a Pixel》 作者是Google大佬 Steve Kobes 2020年 介绍Chromium内核完整渲染流程的视频,介绍的非常好,想要学习了解chromium内核渲染必看! 油管视频地址为:https://w…...

系统部署【信创名录】及其查询地址
一、信创类型 (一)服务器: 1.华为云 2.腾讯云 3.阿里云 (二)中央处理器(CPU): 1.海思,鲲鹏920服务器 (三)中间件 1.人大金仓 ࿰…...
VSCode 配置优化指南:打造高效的 uni-app、Vue2/3、JS/TS 开发环境
VSCode 配置优化指南,适用于 uni-app、Vue2、Vue3、JavaScript、TypeScript 开发,包括插件推荐、设置优化、代码片段、调试配置等,确保你的开发体验更加流畅高效。 1. 安装 VSCode 如果你还未安装 VSCode,可前往 VSCode 官网 下载最新版并安装。 2. 安装推荐插件 (1) Vue…...
C++中的析构函数
目录 一、什么是析构函数: 二、析构函数的特性: 一、什么是析构函数: C中的析构函数非常简单,它的功能无非是帮助我们自动归还堆区的空间给操作系统。当我们使用内存开辟函数(如malloc()、realloc())等&a…...

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 抗噪声…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...

USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...

深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...
动态 Web 开发技术入门篇
一、HTTP 协议核心 1.1 HTTP 基础 协议全称 :HyperText Transfer Protocol(超文本传输协议) 默认端口 :HTTP 使用 80 端口,HTTPS 使用 443 端口。 请求方法 : GET :用于获取资源,…...
LOOI机器人的技术实现解析:从手势识别到边缘检测
LOOI机器人作为一款创新的AI硬件产品,通过将智能手机转变为具有情感交互能力的桌面机器人,展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家,我将全面解析LOOI的技术实现架构,特别是其手势识别、物体识别和环境…...
Oracle11g安装包
Oracle 11g安装包 适用于windows系统,64位 下载路径 oracle 11g 安装包...
微服务通信安全:深入解析mTLS的原理与实践
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、引言:微服务时代的通信安全挑战 随着云原生和微服务架构的普及,服务间的通信安全成为系统设计的核心议题。传统的单体架构中&…...