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…...

7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...

从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP
编辑-虚拟网络编辑器-更改设置 选择桥接模式,然后找到相应的网卡(可以查看自己本机的网络连接) windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置,选择刚才配置的桥接模式 静态ip设置: 我用的ubuntu24桌…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】,分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...
08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险
C#入门系列【类的基本概念】:开启编程世界的奇妙冒险 嘿,各位编程小白探险家!欢迎来到 C# 的奇幻大陆!今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类!别害怕,跟着我,保准让你轻松搞…...
git: early EOF
macOS报错: Initialized empty Git repository in /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/.git/ remote: Enumerating objects: 2691797, done. remote: Counting objects: 100% (1760/1760), done. remote: Compressing objects: 100% (636/636…...
在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南
在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南 背景介绍完整操作步骤1. 创建Docker容器环境2. 验证GUI显示功能3. 安装ROS Noetic4. 配置环境变量5. 创建ROS节点(小球运动模拟)6. 配置RVIZ默认视图7. 创建启动脚本8. 运行可视化系统效果展示与交互技术解析ROS节点通…...