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

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

相关推荐
外收内放15 小时前
FastAPI猜字谜实战(4):让AI主持人开口
开发语言·python·学习·fastapi
外收内放17 小时前
FastAPI猜字谜实战(6):日志与异常
开发语言·python·学习·fastapi
小林ixn18 小时前
用 FastAPI + SQLAlchemy 从零手搓一个博客系统:一套能落地、能讲清楚的 RESTful 后端
后端·python·fastapi
外收内放20 小时前
FastAPI猜字谜实战(5):会话管理
开发语言·python·学习·fastapi
Sakura_j_h_2 天前
给 FastAPI 接大模型:超时、重试和 token 成本该怎么管
python·大模型·fastapi·超时重试·token计费
小林ixn2 天前
FastAPI + LangChain 实战:从 0 到 1 打造高性能 AI 后端服务
人工智能·langchain·fastapi
ratel️3 天前
小墨析 · Office Agent 日常办公不烧心
python·langchain·word·excel·fastapi·js·ppt
外收内放3 天前
FastAPI猜字谜实战(3):把每一局存成JSON
开发语言·python·学习·json·fastapi
Json____4 天前
用 FastAPI + Vue3 打造一套健身私教课预约管理系统
后端·fastapi·it学习·wwwoop.com
溪语流沙4 天前
【Web全栈进阶】监控与告警:线上系统的“体检报告”
前端·vue.js·python·fastapi