大家好,我是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
洋葱模型多个中间件像洋葱一样层层包裹,请求由外向内,响应由内向外
ASGIFastAPI 是 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

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

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐