记录 Flask 项目中常见的中间件封装方式,便于统一管理请求前后处理逻辑。


一、使用请求钩子

Flask 自带的 before_requestafter_request 可以作为简单中间件使用。

from flask import Flask, request

app = Flask(__name__)

@app.before_request
def before_request():
    print(f"请求路径: {request.path}")

@app.after_request
def after_request(response):
    response.headers["X-Custom-Header"] = "Hello"
    return response

二、函数式中间件封装

适合小范围复用的处理逻辑。

def log_middleware(app):
    @app.before_request
    def log_request():
        print(f"[LOG] {request.method} {request.path}")

    @app.after_request
    def log_response(response):
        print(f"[LOG] 状态码: {response.status_code}")
        return response

注册:

log_middleware(app)

三、类中间件封装(WSGI)

可在应用层外包裹一层,实现更底层的拦截。

class SimpleMiddleware:
    def __init__(self, app):
        self.app = app

    def __call__(self, environ, start_response):
        print("请求到达中间件")
        return self.app(environ, start_response)

app.wsgi_app = SimpleMiddleware(app.wsgi_app)

四、蓝图级别中间件

在特定蓝图下使用 before_requestafter_request

from flask import Blueprint

bp = Blueprint('api', __name__)

@bp.before_request
def bp_before():
    print("API 蓝图请求前处理")

@bp.after_request
def bp_after(response):
    print("API 蓝图请求后处理")
    return response

app.register_blueprint(bp, url_prefix="/api")

五、小结

  • 全局中间件:适合日志、统一返回格式、权限校验
  • 蓝图中间件:适合模块化管理逻辑
  • WSGI 中间件:更底层的请求拦截,能跨框架使用