《Python实战进阶》专栏No2:Flask中间件与请求钩子的应用
- 开源代码
- 2025-09-01 04:12:02

专栏简介
《Python实战进阶》专栏共68集,分为 模块1:Web开发与API设计(共10集);模块2:数据处理与分析(共10集);模块3:自动化与脚本开发(共8集);模块4:机器学习与深度学习(共12集);模块5:并发与性能优化(共8集);模块6:网络编程与安全(共8集);模块7:云计算与容器化(共6集);模块8:综合实战与扩展(共6集);覆盖了Python在不同领域的应用,并结合了实际开发中的热点和难点。这些内容可以帮助读者从基础到高级逐步掌握Python技术,同时为实际项目开发提供参考。
专栏特色 聚焦实战:每集都包含实际案例和代码示例,帮助读者快速上手。覆盖全面:从基础到高级,涵盖 Python 的多个应用场景。模块化设计:每个模块独立成体系,便于读者按需学习。持续更新:根据技术发展趋势,定期补充新内容。 《Python实战进阶》专栏 No2: Flask 中间件与请求钩子的应用在 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 应用,演示如何使用中间件和请求钩子实现以下功能:
日志记录:记录每个请求的路径和方法。性能监控:测量每个请求的处理时间。权限验证:检查用户是否有访问权限。完整代码 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:
访问公共资源
GET /public输出:
{ "message": "This is a public resource." }访问受保护资源(无权限)
GET /protected Authorization: Bearer wrong-token输出:
{ "error": "Unauthorized" }访问受保护资源(有权限)
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 的中间件与请求钩子!如果你有任何问题或建议,请随时告诉我!
参考资料 Flask 官方文档: flask.palletsprojects /WSGI 规范: .python.org/dev/peps/pep-3333/
《Python实战进阶》专栏No2:Flask中间件与请求钩子的应用由讯客互联开源代码栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“《Python实战进阶》专栏No2:Flask中间件与请求钩子的应用”
下一篇
最长回文子串(蓝桥云课)