FastAPI python web开发- 中间件

大家好,我是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

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

相关推荐
大模型丫丫1 天前
FastAPI 入门指南:从零开始构建高性能 Python API
开发语言·python·fastapi
卷无止境1 天前
Python的contextlib与 FastAPI 中的上下文管理
后端·python·fastapi
卷无止境1 天前
FastAPI Events 深度解析与工程实践
后端·python·fastapi
小月土星2 天前
构建 AI 应用的后端,最主流的选择就是 Python + FastAPI。
后端·fastapi
微学AI3 天前
我把 800 行报错日志压成一张排障卡:用蓝耘元生代做 FastAPI 日志根因分析
网络·oracle·fastapi
捧 花3 天前
FastAPI 基础语法:从一个完整接口理解 Web API 的设计
前端·python·fastapi·middleware
卷无止境3 天前
除了开发api,FastAPI其实也可以配合jinja2模板写页面
后端·python·fastapi
练习两年半的攻城狮3 天前
FastAPI + LlamaIndex Agent 流式对话踩坑实录
fastapi·llamaindex
卷无止境4 天前
Linux + Docker + FastAPI 工程化实践指南
后端·python·fastapi
皮卡丘不断更5 天前
手机优先的 Personal Ledger:把账目、学习和复盘放到同一个入口
数据库·sqlite·fastapi·开源项目·个人效率