fastapi: 第十六章:fastapi使用全局中间件:请求和响应的拦截器

一,中间件的用途

什么是中间件?

中间件是一个在请求到达你的路由函数之前、以及响应返回给客户端之后,执行一些代码的组件。

可以把中间件想象成一个安检通道:

请求进来时,先经过安检(中间件)

安检通过后,才进入业务处理(路由函数)

业务处理完成后,响应出去之前,还要再经过一次安检

中间件能做什么?

中间件的应用场景非常多:

记录每个请求的日志

统计接口响应时间

添加统一的响应头(如X-Powered-By)

请求限流(防止恶意请求)

全局异常处理

CORS跨域处理

Gzip压缩响应内容

二,代码

定义中间件:

# app/middleware/log_time.py
from fastapi import FastAPI, Request
import time

# 一个简单的记录请求执行时间的中间件
async def log_time_middleware(request: Request, call_next):
    # 这部分代码在请求进入路由前执行
    start_time = time.time()
    print(f"收到请求: {request.method} {request.url.path}")

    # 调用下一个中间件或最终的路由函数
    response = await call_next(request)

    # 这部分代码在响应返回给客户端前执行
    process_time = time.time() - start_time
    print(f"处理耗时: {process_time:.4f}秒")

    # 可以修改响应头
    # response.headers["X-Process-Time"] = str(process_time)
    return response

main.py中应用全局中间件

# main.py
from fastapi import FastAPI
from app.api import products, users, account
from app.core.exceptions import register_exception_handlers

from starlette.middleware.base import BaseHTTPMiddleware
# 📂 跨目录导入你的中间件函数
from app.middleware.log_time import log_time_middleware

# 创建FastAPI应用
app = FastAPI(title="我的API项目")

# 注册全局异常捕获
register_exception_handlers(app)

# 🚀 注册中间件(使用 BaseHTTPMiddleware 包装你的中间件)
app.add_middleware(BaseHTTPMiddleware, dispatch=log_time_middleware)

# 注册路由模块
app.include_router(users.router)

 

三,测试效果:

image

 

posted @ 2026-06-10 15:20  刘宏缔的架构森林  阅读(7)  评论(0)    收藏  举报