Flask 中间件详解

在 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) – 在每个请求之后运行。
  • 记录响应状态码
  • 返回响应以完成请求周期。

输出:

!Middleware-output

中间件输出

请注意,每当我们刷新 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

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。如需转载,请注明文章出处豆丁博客和来源网址。https://shluqu.cn/53046.html
点赞
0.00 平均评分 (0% 分数) - 0