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 应用,演示如何使用中间件和请求钩子实现以下功能:
- 日志记录:记录每个请求的路径和方法。
- 性能监控:测量每个请求的处理时间。
- 权限验证:检查用户是否有访问权限。
完整代码
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 官方文档:https://flask.palletsprojects.com/
- WSGI 规范:https://www.python.org/dev/peps/pep-3333/
热门推荐
有一种胸口刺痛非常危险,心脏发出的7个信号值得警惕
苏州园林,江南雅韵中,拙政园内的小桥流水人家
高铁让城市不再遥远:茌平到郑州的“同城化”生活
济郑高铁即将开通!从茌平到郑州只需1小时39分
茌平到郑州高铁出行全攻略:车站信息、交通接驳与购票建议
龙年首波寒潮来袭!茌平至郑州多地气温骤降,出行需谨慎
感恩节:让爱情升温的暖心情话与活动指南
感恩节将至!教你写出最暖心祝福语
感恩节来了!给好友送上最暖祝福吧
感恩节对孩子说:感谢有你!
上海一日游必打卡:东方明珠塔和外滩的完美组合
景德镇两处景点入选大众点评必玩榜:千年瓷都的文化新地标
景德镇乐天市集:瓷器收藏爱好者的周末天堂
2024云南最佳旅游季节和注意事项,专为自由行设计的旅行攻略
77岁汪明荃被质疑33岁演少女阻碍后生发展,霸气回应获网友点赞
张柏芝相关影片引发的热议与思考
赵本山携四部新作强势回归,姜文加盟引爆期待!
赵本山小品爆笑瞬间:从《相亲》到《同桌的你》,这些经典你都记得吗?
赵本山携三部新作重返荧幕,能否再创春晚辉煌?
心口、胸口突然感觉痛是什么意思?心脏不舒服有哪些症状?需要看专科医生吗?
别乱用筒自洁!干净省心的洗衣机清洁大全总结好了
冰箱怎么臭臭的?8个天然方法教你快速除臭!
尧山下的千年守望:牛郎织女的传说与葡萄园
2 招教你在 Windows 中更专业地格式化 U 盘
如何格式化U盘?4个正确方法,记得收藏好!
U盘量产工具使用指南:修复存储问题与数据管理技巧
七夕将至,揭秘尧山牛郎织女爱情传奇
秋日探秘尧山:华山之险峨眉之峻
探访尧坝古镇:千年古建的守护者
洛阳出发,一小时邂逅“中原独秀”尧山