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

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

相关推荐
LK_077 天前
【FastAPI】基础篇 01|开始之前:API、HTTP 与 FastAPI 到底是什么
网络协议·http·fastapi
一枕槐安48712 天前
Qwen 通义千问本地部署与推理服务封装
fastapi·qwen·vllm·流式推理·openai兼容api·awq量化
在努力的前端小白12 天前
基于FastAPI+LangChain+LangGraph+Agent+多模态的AI Agent 有渔渔具网站
人工智能·langchain·vue·fastapi
sun_weitao13 天前
用 FastAPI + MQTT 做一个 ESP32最小化跑通示例
中间件·vue·fastapi
峯58013 天前
一文学习FastAPI
学习·fastapi
TheBestRucy15 天前
从零构建企业级“中文法律智能问答系统”:FastAPI+Milvus+混合检索+真流式RAG实战
fastapi·milvus
卡提西亚15 天前
FastAPI基础入门
python·fastapi
Paper-Tiger16 天前
手搓 FastAPI + Redis + 流式 RAG 实录
fastapi
像风一样自由202016 天前
2.如何用FastAPI把一个Python算法封装成HTTP服务
python·算法·fastapi
狗凯之家源码网16 天前
iOS C2 V2 与 Python FastAPI 全链路远控系统深度评测
python·ios·fastapi