在Python HTTP服务开发中,中间件(Middleware)通过拦截请求与响应流,为应用提供了统一的横切点处理能力,其核心实现依赖于责任链模式与装饰器模式的结合。

请求拦截:链式调用与预处理

当客户端发起HTTP请求时,中间件首先通过装饰器或框架提供的钩子函数(如WSGI的app包装)拦截原始请求。以Flask为例,@app.before_request装饰器可将函数注册为请求预处理中间件,在路由处理前执行认证、日志记录等操作。在异步框架(如FastAPI)中,中间件通过@app.middleware("http")实现,接收Request对象并返回Response或继续调用下游处理。此时,中间件可修改请求头、参数校验或触发限流逻辑,若拦截失败则直接返回错误响应,终止请求链。

响应拦截:后处理与统一封装

响应中间件在路由处理完成后介入,通过装饰器(如@app.after_request)或框架钩子捕获响应对象。其典型应用包括:统一添加CORS头、压缩响应体、记录响应时间等。在FastAPI中,中间件可修改Response对象的status_codeheadersbody,甚至将非JSON响应转换为统一格式。例如,某API网关通过中间件将所有响应包装为{"code": 200, "data": ...}结构,仅需一行代码即可实现全局响应标准化。

动态控制:上下文传递与流程中断

高级中间件需支持上下文传递(如请求ID、用户权限)和流程控制。通过Python的contextvars模块或自定义上下文对象,中间件可在请求链中共享数据。例如,认证中间件将用户信息存入上下文,后续中间件可直接读取。同时,中间件可通过抛出异常或返回None中断处理链,结合框架的异常处理器实现错误统一处理。这种设计使得日志、监控等非业务逻辑与核心代码解耦,显著提升代码可维护性。

更多推荐