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

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

相关推荐
不能只会打代码4 小时前
Day 002 — Python 工程化 & FastAPI & 数据库速通
数据库·redis·python·docker·fastapi·测试
zhiSiBuYu05175 小时前
FastAPI 结合 Jinja2 模板开发入门指南
fastapi
allnlei7 小时前
React + FastAPI 前后端分离架构下的 Nginx 配置实践
react.js·架构·fastapi
诸神缄默不语1 天前
FastAPI后端配置CORS中间件支持浏览器跨域访问
后端·fastapi
开源技术1 天前
Fastapi教程: 身份认证与授权03——带有 password 和 Bearer 的简单 OAuth2
fastapi
java1234_小锋2 天前
FastAPI python web开发- 表单数据与模型 & 请求表单与文件 & 响应类型 - 返回文件类型
fastapi
hboot3 天前
AI工程师第五课 - 大语言模型基础
python·llm·fastapi
喜欢的名字被抢了3 天前
Python实战:SQLAlchemy ORM与FastAPI项目集成
开发语言·python·sql·教程·fastapi
阿豪只会阿巴3 天前
两小时快速入门 FastAPI--第二回
windows·python·fastapi