大家好我是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 → C3.2 洋葱模型示意┌──────────────────────────────┐ │ Middleware C │ ← 最后注册请求最先经过 │ ┌────────────────────────┐│ │ │ Middleware B ││ │ │ ┌──────────────────┐ ││ │ │ │ Middleware A │ ││ │ │ │ ┌────────────┐ │ ││ │ │ │ │ 路由处理 │ │ ││ ← 核心逻辑 │ │ │ └────────────┘ │ ││ │ │ └──────────────────┘ ││ │ └────────────────────────┘│ └──────────────────────────────┘ 请求C → B → A → 路由 响应路由 → A → B → C4. 中间件的两种实例我们使用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验证了后注册中间件的是先执行。