Flask 会话变量在 Ajax 请求之间不持久

问题描述 投票:0回答:1

在我的 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 在更新的函数完成之前无法读取更新的会话变量。

javascript python ajax flask session-variables
1个回答
0
投票

我解决了这个问题。简短的回答是我需要使用 Flask-Session 来使用服务器端会话。

长答案:我误解了会话变量到底是什么。

session["load_percent"]
使用随请求发送的会话数据在请求调用的函数中本地创建。在第一个函数返回包含更新的会话数据的响应之前,它不会更新以供其他函数使用。

© www.soinside.com 2019 - 2024. All rights reserved.