记录 Flask 项目中常见的中间件封装方式,便于统一管理请求前后处理逻辑。
一、使用请求钩子
Flask 自带的 before_request
和 after_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_request
与 after_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 中间件:更底层的请求拦截,能跨框架使用