一、视频教程
15_Flask集成WSGI中间件
通过本节课程的学习,你将学会通过WSGI中间件来增强日志记录功能,使用 app.wsgi_app 来包装中间件,并保持 app 指向原始的Flask应用,达到降低代码耦合度、增强代码可维护性和扩展性。《Flask快速入门教程》,人人都能学,小白看得懂学得会,跟我学编程,免费领取配套学习资料。
二、WSGI 是什么
WSGI(Web Server Gateway Interface)是一种用于Python Web应用程序的标准接口,它定义了服务器如何与应用程序或框架进行通信。通过使用WSGI中间件,你可以在请求到达Flask应用之前和响应返回客户端之前对它们进行处理。
三、WSGI中间件应用场景
3.1 日志记录
记录每个请求和响应的详细信息。
3.2 身份验证
在请求到达应用之前进行身份验证。
3.3 性能监控
测量请求处理时间。
3.4 错误处理
捕获并处理异常。
3.5 重写路由
修改请求路径或其他头信息。
四、WSGI中间件集成
下面使用一个简单的Flask应用,并通过WSGI中间件来增强日志记录功能。我们将使用 app.wsgi_app 来包装中间件,并保持 app 指向原始的Flask应用,达到降低代码耦合度、增强代码可维护性和扩展性。
4.1 初始代码
Ctrl + C 拷贝 02-start-params,粘贴到 flask-study 目录,然后命名为 12-wsgi-middleware
3.2 日志中间件
LoggingMiddleware 类:
import time
from werkzeug.wrappers import Request
class LoggingMiddleware:
# __init__ 方法初始化中间件,接收一个 app 参数
def __init__(self, app):
self.app = app
# __call__ 方法是可调用对象的核心,当请求到达时会被调用。
# environ:传递请求数据
# start_response:回调函数
def __call__(self, environ, start_response):
# 记录请求开始时间
start_time = time.time()
# 使用 Werkzeug 的 Request 解析请求信息
request = Request(environ)
# 在请求到达应用之前打印请求信息
print(f"Request received: {request.method} {request.url}")
# 定义 custom_start_response 函数,在响应返回客户端之前计算并打印响应的状态码和处理时间
# status:获取响应的状态码和状态信息
# headers:获取响应的所有头信息
# exc_info:如果存在异常信息,则将其传递给原始的 start_response 函数
def custom_start_response(status, headers, exc_info=None):
# 记录请求结束时间
end_time = time.time()
# 处理时间
duration = end_time - start_time
# 打印响应状态码和处理时间(单位为秒并且保留四位小数)
print(f"Response status: {status}, Duration: {duration:.4f}s")
# 调用原始的 start_response 函数
return start_response(status, headers, exc_info)
# 调用原始的应用,并传递 environ 和 custom_start_response
return self.app(environ, custom_start_response)
4.3 将日志中间件应用到Flask应用上
# 使用 app.wsgi_app 包装中间件
app.wsgi_app = LoggingMiddleware(app.wsgi_app)
4.4 测试效果
每次访问Flask应用时,都会先经过中间件的处理,记录请求和响应的相关信息。同时,app 仍然指向原始的Flask应用,我们可以继续直接使用和配置它。
启动应用服务:
访问:http://127.0.0.1:5000/