在我的 Flask 应用程序中,我试图向客户端显示后端任务的进度。客户端发送开始任务的初始请求。该任务包含一个循环,并且在迭代时会更新包含完成百分比的会话变量。然后,客户端定期发送额外的请求来检索会话变量的值,以便可以显示它。
问题在于,每当检索会话变量时,它只包含其初始值 0%。如果我用全局变量替换会话变量,它可以正常工作,但应用程序需要支持多个并发用户,因此我无法使用全局变量。我的理解是,会话变量就是为了这个确切的目的,在同一会话中的请求之间持续存在,但我一定错过了一些东西,因为它在这里没有这样做。
这是我的 Flask 代码的简化版本:
@app.route("/task")
def task():
session["load_percent"] = 0
percent = 0
for i in range(10000000):
#actual task performed here
old_percent = percent
percent = round(i / 10000000 * 100)
if old_percent != percent:
session["load_percent"] = percent
print("Actual percentage: " + str(session["load_percent"]))
#this prints the correct value of the session variable
return "{}"
@app.route("/get_load_percent")
def get_load_percent():
try:
print("Retrieved percentage: " + str(session["load_percent"]))
#this always prints 0
return json.dumps({"load_percent": session["load_percent"]})
except (KeyError):
return "{}"
还有我的前端 JS:
function startTask() {
$.ajax({
type: "GET",
url: $('body').data('task'),
dataType: 'json',
success: function(response) {
//respond to task completion here
}
});
let percentageHTML = "";
let percentageInterval = setInterval(function() {
$.ajax({
type: "GET",
url: $('body').data('getloadpercent'),
dataType: 'json',
success: function(response) {
percentageHTML = response["load_percent"];
console.log(percentageHTML);
//always prints 0
}
})
}, 100);
}
我检查过类似的问题,他们的解决方案不起作用。会话变量不超过大小限制,并且每次都会设置密钥而不是就地更改其值,因此不需要将其标记为已修改。
更新:我做了一些更多的测试,有时,对百分比值的最后一个请求将返回100。此外,在循环开始之前,在
task()
开始时将会话变量设置为完全不同的数字,仍然返回0。
这告诉我会话的 cookie 正在正确发送/解码,但是某些原因导致 Flask 在更新的函数完成之前无法读取更新的会话变量。
我解决了这个问题。简短的回答是我需要使用 Flask-Session 来使用服务器端会话。
长答案:我误解了会话变量到底是什么。
session["load_percent"]
使用随请求发送的会话数据在请求调用的函数中本地创建。在第一个函数返回包含更新的会话数据的响应之前,它不会更新以供其他函数使用。