大家好,我是Java1234_小锋老师,最近更新《2027版 一天学会 FastAPI Python web开发 视频教程(无废话版)》专辑,感谢大家支持。

本课程主要介绍和讲解FastAPI简介,HelloWorld实现,自动生成交互式API文档,路径参数,查询参数,请求体,参数校验,响应模型 ,表单数据和模型,中间件,依赖注入,集成SQLAlchemy ORM 操作数据库,集成Pydantic数据校验等
视频教程+课件+源码打包下载:
链接:https://pan.baidu.com/s/1_NzaNr0Wln6kv1rdiQnUTg
提取码:0000
中间件
1. 什么是中间件
中间件(Middleware) 是在 HTTP 请求到达路由处理函数之前 ,以及响应返回客户端之前,插入的一层可编程逻辑。
你可以把它理解为请求/响应管道中的「拦截器」:
-
请求阶段:从外到内依次执行,可对请求做校验、日志、鉴权等
-
响应阶段:从内到外依次返回,可对响应做压缩、加 Header、统一格式化等
FastAPI 基于 Starlette 实现,中间件机制与 Starlette 完全一致。
2. 中间件工作原理

2.1 核心流程
客户端
│ HTTP Request
▼
┌─────────────────┐
│ Middleware │ ← 请求进入:预处理(日志、鉴权、计时...)
└────────┬────────┘
▼
┌─────────────────┐
│ FastAPI 路由 │ ← 执行业务逻辑(path operation)
└────────┬────────┘
│ HTTP Response
▼
┌─────────────────┐
│ Middleware │ ← 响应返回:后处理(加 Header、压缩...)
└────────┬────────┘
▼
客户端
2.2 关键概念
| 概念 | 说明 |
|---|---|
call_next |
调用下一个中间件或最终路由,必须 await |
| 洋葱模型 | 多个中间件像洋葱一样层层包裹,请求由外向内,响应由内向外 |
| ASGI | FastAPI 是 ASGI 应用,中间件需支持异步 |
3. 多个中间件的执行顺序

3.1 注册顺序与执行顺序
重要规则:后注册(add_middleware 后调用)的中间件,在请求阶段最先执行。
假设注册顺序为:
app.add_middleware(MiddlewareA) # 第 1 个注册
app.add_middleware(MiddlewareB) # 第 2 个注册
app.add_middleware(MiddlewareC) # 第 3 个注册(最后注册)
实际执行顺序:
| 阶段 | 执行顺序 |
|---|---|
| 请求进入 | C → B → A → 路由 |
| 响应返回 | 路由 → A → B → C |
3.2 洋葱模型示意
┌──────────────────────────────┐
│ Middleware C │ ← 最后注册,请求最先经过
│ ┌────────────────────────┐│
│ │ Middleware B ││
│ │ ┌──────────────────┐ ││
│ │ │ Middleware A │ ││
│ │ │ ┌────────────┐ │ ││
│ │ │ │ 路由处理 │ │ ││ ← 核心逻辑
│ │ │ └────────────┘ │ ││
│ │ └──────────────────┘ ││
│ └────────────────────────┘│
└──────────────────────────────┘
请求:C → B → A → 路由
响应:路由 → A → B → C
4. 中间件的两种实例
我们使用 @app.middleware("http")注解即可实现中间件。
我们先看一个简单示例:
@app.middleware("http")
async def my_middleware1(request, call_next):
print("中间件1 - > 执行前")
response = await call_next(request)
print("中间件1 - > 执行后")
return response
@app.get("/")
async def root():
return {"message": "你好,FastAPI 333!"}
@app.get("/helloWorld")
async def helloWorld():
return {"message": "你好,helloWorld !"}
浏览器请求 http://127.0.0.1:8000/helloWorld
控制台输出:

我们浏览器再请求下:http://127.0.0.1:8000/
控制台输出:

说明所有请求处理方法都共享中间件
我们再添加一个中间件
@app.middleware("http")
async def my_middleware1(request, call_next):
print("中间件1 - > 执行前")
response = await call_next(request)
print("中间件1 - > 执行后")
return response
@app.middleware("http")
async def my_middleware2(request, call_next):
print("中间件2 - > 执行前")
response = await call_next(request)
print("中间件2 - > 执行后")
return response
浏览器请求 http://127.0.0.1:8000/helloWorld

验证了后注册中间件的是先执行。