Return 通过 Ajax 使用 Django 调用更新会话变量(在加载页面时)

Return updated session variables (while page is loading) through Ajax call using Django

我现在想做的和完成的事情:

一个用户来到我的 Django 网页提交一个带有几个输入字段的简单表单,该表单在我的 background_process 视图函数中启动了一个复杂的后台进程。我正在尝试使用会话变量,以便我可以处理多个用户,而不会在后台处理期间变量相互覆盖。 Ajax 在后台处理期间运行,调用我的其他视图函数 callback_progress。

callback_progress 正在使用 return 通过 return JsonResponse(data) 编辑到我的 javascript/jquery ajax 的变量更新 JSON:

def callback_progress(request):

    request.session["data"]['numgames'] = request.session["numgames"]
    request.session["data"]['progress'] = request.session["progress"]
    request.session["data"]['win_ratio'] = request.session["win_ratio"]

    response = JsonResponse(request.session["data"])

    return response

我可以从 Ajax 调用中成功 return JsonResponse。这是我的 Ajax 和 console.log(data) 的样子:

Ajax(为了可读性做了一些简化,我正在更新我删除的成功块中的一些 html 元素)

$("#myButton").click(function result_poll() {
        function ajax_call() {
            $.ajax({
                headers: {'X-CSRFToken': csrftoken},
                type : "POST",
                url : "/callback_progress/",
                data: "{{ data }}",
                success: function(data) {
                    console.log(data);

                    if (data["progress"] == data["numgames"] && data["progress"] != "0") {
                        clearInterval(interval_id);
                    }
                },
                error: function() {
                    console.log("something went wrong");
                }
            });

        };
        var interval_id = setInterval(ajax_call, 2000);
    });

Console.log输出

{numgames: "0", progress: "0", win_ratio: "0"}
{numgames: "0", progress: "0", win_ratio: "0"}
{numgames: "0", progress: "0", win_ratio: "0"}
{numgames: "0", progress: "0", win_ratio: "0"}
{numgames: "0", progress: "0", win_ratio: "0"}

帮我理解一下:

为什么我的会话变量没有从服务器 return 更新值?

我可以通过打印会话变量值看到它们在我的本地运行服务器上更新了:

{numgames: "5", progress: "1", win_ratio: "0"}
{numgames: "5", progress: "2", win_ratio: "10"}
{numgames: "5", progress: "3", win_ratio: "20"}
{numgames: "5", progress: "4", win_ratio: "30"}
{numgames: "5", progress: "5", win_ratio: "40"}

这是我在 settings.py 中与我所做的研究相关的内容:

SESSION_ENGINE = "django.contrib.sessions.backends.signed_cookies"

SESSION_SAVE_EVERY_REQUEST = True

我在这里缺少什么允许我在页面加载时 return 向客户端发送具有更新数据的会话变量?

我正在使用 Python-3.6 和 Django-1.10.6

我的引擎问题:我使用了错误的SESSION_ENGINE来实现我想要完成的目标。

SESSION_ENGINE = "django.contrib.sessions.backends.signed_cookies"

在 HttpResponse 发生之前(在页面 reloaded/redirected 之后),signed_cookies 会话引擎不会更新客户端可见的会话变量。至少那是我的经历。

我将会话引擎更新为使用数据库会话 table(根据 session docs,这实际上是默认设置):

SESSION_ENGINE = "django.contrib.sessions.backends.db"

引擎切换后: 我需要明确地 "save the existing session" 会话 table 所以我查看了 [= 中记录的 save() 方法17=]

request.session.save()

作为信息,我仍然在 settings.py 中使用此设置以确保每个请求都保存我的会话对象:

SESSION_SAVE_EVERY_REQUEST = True

没有 request.session.save() 我的代码没有适当地更新会话变量。

这是我现在的回调,它确保会话变量对于我的客户端来说是最新的 ajax 调用:

def callback_progress(request):

    request.session["data"]['numgames'] = request.session["numgames"]
    request.session["data"]['progress'] = request.session["progress"]
    request.session["data"]['win_ratio'] = round(request.session["win_ratio"],2)

    request.session.save()

    response = JsonResponse(request.session["data"])

    return response