问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Flask 中间件与请求钩子的应用实战

创作时间:
作者:
@小白创作中心

Flask 中间件与请求钩子的应用实战

引用
CSDN
1.
https://blog.csdn.net/yweng18/article/details/145717362

在 Web 开发中,中间件(Middleware)请求钩子(Request Hooks)是非常重要的概念。它们可以帮助我们处理跨请求的逻辑,例如日志记录、权限验证、性能监控等。Flask 提供了灵活的机制来实现这些功能,使得开发者可以轻松地扩展应用的功能。
本文将详细介绍 Flask 的中间件和请求钩子,并通过实战代码展示其应用场景。

什么是中间件?

定义

中间件是一种拦截 HTTP 请求和响应的组件,通常用于在请求到达视图函数之前或响应返回客户端之前执行特定的逻辑。它可以在不修改核心业务逻辑的情况下,为应用添加额外的功能。

在 Flask 中实现中间件

Flask 的中间件可以通过 WSGI 中间件的方式实现。WSGI(Web Server Gateway Interface)是 Python Web 应用的标准接口,Flask 本身就是一个 WSGI 应用。

什么是请求钩子?

定义

请求钩子是 Flask 提供的一种装饰器机制,用于在请求的不同阶段执行特定的逻辑。常见的请求钩子包括:

@before_request
:在每个请求之前执行。

@after_request
:在每个请求之后执行(如果视图函数没有抛出异常)。

@teardown_request
:在每个请求结束时执行(无论是否发生异常)。

@before_first_request
:在应用接收第一个请求之前执行(Flask 2.3 后已废弃)。

实战案例:使用中间件与请求钩子

我们将构建一个简单的 Flask 应用,演示如何使用中间件和请求钩子实现以下功能:

  1. 日志记录:记录每个请求的路径和方法。
  2. 性能监控:测量每个请求的处理时间。
  3. 权限验证:检查用户是否有访问权限。

完整代码

from flask import Flask, request, jsonify, g
import time
from functools import wraps

app = Flask(__name__)

# 中间件:记录请求日志
class LoggingMiddleware:
    def __init__(self, app):
        self.app = app

    def __call__(self, environ, start_response):
        # 记录请求信息
        print(f"Request received: {environ['REQUEST_METHOD']} {environ['PATH_INFO']}")
        return self.app(environ, start_response)

# 注册中间件
app.wsgi_app = LoggingMiddleware(app.wsgi_app)

# 请求钩子:性能监控
@app.before_request
def start_timer():
    g.start_time = time.time()

@app.after_request
def log_request(response):
    if hasattr(g, 'start_time'):
        duration = round(time.time() - g.start_time, 2)
        print(f"Request took {duration} seconds")
    return response

# 请求钩子:权限验证
def require_auth(f):
    @wraps(f)
    def decorated_function(*args, **kwargs):
        auth_token = request.headers.get('Authorization')
        if auth_token != "Bearer my-secret-token":
            return jsonify({"error": "Unauthorized"}), 401
        return f(*args, **kwargs)
    return decorated_function

@app.route('/protected', methods=['GET'])
@require_auth
def protected():
    return jsonify({"message": "You have access to this protected resource!"})

@app.route('/public', methods=['GET'])
def public():
    return jsonify({"message": "This is a public resource."})

# 启动应用
if __name__ == '__main__':
    app.run(debug=True)

代码解析

1.中间件:LoggingMiddleware

  • 我们定义了一个
    LoggingMiddleware
    类,用于拦截所有请求并打印请求方法和路径。
  • 在构造函数中接收 Flask 应用的
    wsgi_app
    ,并在
    call
    方法中调用原始的 WSGI 应用。
  • 将中间件注册到 Flask 应用中:
    app.wsgi_app = LoggingMiddleware(app.wsgi_app)

    图1:中间件工作原理
    (图片描述:流程图展示了请求从客户端到中间件再到 Flask 应用的传递过程,中间件记录了请求信息。)
    2.请求钩子:性能监控
  • 使用
    @before_request
    钩子记录请求开始时间。
  • 使用
    @after_request
    钩子计算请求处理时间,并打印日志。
  • g
    是 Flask 提供的全局对象,用于存储请求上下文中的数据。
    3.请求钩子:权限验证
  • 定义了一个装饰器
    require_auth
    ,用于检查请求头中的
    Authorization
    字段。
  • 如果验证失败,返回 401 错误;否则继续执行视图函数。

运行结果

启动 Flask 应用后,访问以下 URL:

  1. 访问公共资源
GET /public

输出:

{
    "message": "This is a public resource."
}
  1. 访问受保护资源(无权限)
GET /protected
Authorization: Bearer wrong-token

输出:

{
    "error": "Unauthorized"
}
  1. 访问受保护资源(有权限)
GET /protected
Authorization: Bearer my-secret-token

输出:

{
    "message": "You have access to this protected resource!"
}

控制台日志:

Request received: GET /public
Request took 0.01 seconds
Request received: GET /protected
Request took 0.02 seconds

总结

本文介绍了 Flask 中间件和请求钩子的基本概念,并通过实战代码展示了它们的应用场景。通过中间件和请求钩子,我们可以轻松实现日志记录、性能监控和权限验证等功能,从而提升应用的可维护性和安全性。
希望这篇文章能帮助你更好地理解和使用 Flask 的中间件与请求钩子!如果你有任何问题或建议,请随时告诉我!

参考资料

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号