在 Web 应用程序中,中间件是一个非常强大的概念,它允许我们在请求到达主应用逻辑之前对其进行处理。在使用 Flask 开发时,中间件函数位于客户端请求和最终响应之间,使我们能够执行日志记录、身份验证、请求修改等任务。
Flask 应用通常在以下场景中使用中间件:
- 身份验证与授权: 在处理请求之前检查用户身份。
- 日志记录与监控: 捕获请求详细信息以便调试和分析。
- 请求验证: 确保请求在到达主应用之前符合特定标准。
- 响应修改: 在发送响应之前添加或修改标头。
- 速率限制与安全: 控制请求频率并防止恶意活动。
让我们来探索一下在 Flask 应用程序中实现中间件的几种方法。
在 Flask 中创建自定义中间件
Flask 提供了一种称为“钩子”的机制,这是一类特殊的函数,允许我们在处理请求之前或之后执行代码。这些钩子有助于修改请求、记录日志、身份验证等。中间件常用的两个钩子是:
- before_request: 在请求处理之前运行。
- after_request: 在请求处理之后运行,如果需要可以修改响应。
在 Flask 中实现中间件的一种简单方法就是使用这些钩子。
from flask import Flask, request
app = Flask(__name__)
@app.before_request
def log_request():
print(f"Incoming request: {request.method} {request.url}")
@app.after_request
def log_response(response):
print(f"Outgoing response: {response.status_code}")
return response
@app.route(‘/‘)
def home():
return "Hello, Flask!"
if __name__ == ‘__main__‘:
app.run(debug=True)
解释:
1. @app.before_request: 处理传入请求的中间件 ()
- log_request(): 在每个请求之前运行。
- 打印 HTTP 方法和请求 URL。
2. @app.after_request: 处理传出响应的中间件 ()
- log_response(response) – 在每个请求之后运行。
- 记录响应状态码。
- 返回响应以完成请求周期。
输出:
中间件输出
请注意,每当我们刷新 Flask 应用时,终端都会显示“Outgoing response: 200”,这是中间件的作用。这展示了中间件如何在到达主逻辑之前处理任务。
身份验证和授权中间件
身份验证中间件确保只有授权用户才能访问特定路由。这对于保护 API 和 Web 应用程序非常有用。让我们创建一个简单的 Flask 应用并在其中实现身份验证和授权中间件。
from flask import Flask, request, jsonify
app = Flask(__name__)
API_KEY = "my_secret_api_key"
@app.before_request
def check_authentication():
token = request.headers.get("Authorization")
if token != f"Bearer {API_KEY}":
return jsonify({"error": "Unauthorized"}), 401
@app.route(‘/protected‘)
def protected():
return jsonify({"message": "Welcome to the protected route!"})
if __name__ == ‘__main__‘:
app.run(debug=True)
解释:
1. before_request 中间件:
- 从请求标头中提取 Authorization 令牌。
- 如果令牌缺失或不正确,返回 401 Unauthorized。
2. /protected – 只有提供有效令牌才能访问的路由。
输出:
我们可以使用 Postman API 测试该应用程序,以下是向 /protected 路由发出 GET 请求并提供标头时的响应快照。
![Middleware2](https://media.geeksforgeeks.org/wp-content/uploads/2025032712285324569