在函数结束前更新 request.session 变量

Update request.session variable before function ends

在 Django 服务器上,我有一个页面,其中包含一个启动功能的按钮。 此功能需要一段时间才能完成,我尝试将流程更新写入 request.session 变量,目的是从单独的页面检查其内容。 然而,似乎 request.session 变量在包含它们的函数完成之前不会更新。至少变量在那之前不会更新。 我是对的,如果是这样,有没有办法在函数完成之前写入 request.session 变量?

会话设置正确,我可以用其他示例写入和读取变量。现在我也只是做一个临时数据库记录来存储状态更新信息并从那里读取它,但我很好奇这个 request.session 事情 - 我的猜测是否正确,有没有办法解决?

更新:

views.py

@login_required
def autolink(request):
    result, time = access_check(request, 'super')
    if not result:
        return redirect('index')
    result = f_autolink(request)
    if result is None:
        result = request.session.get('technical', '')
    return render(request, 'autolink.html', {'result': result, })

functions.py

def f_autolink(request):
    if request.method == 'GET':
        result = None
    elif request.method == 'POST':
        request.session['technical'] = 'starting the job'
        result = f_kzd_autolink(request)
    else:
        result = None
    return result

def f_kzd_autolink(request):
    homeless = Kzd.objects.filter(payment__isnull=True, returned=False).distinct()
    result = []
    count = homeless.count()
    counter = 0
    request.session['technical'] = 'Starting link job - {c} records to process'.format(c=count)
    for h in homeless:
        counter += 1
        request.session['technical'] = 'Checking record {c1} of {c}'.format(c1=counter, c=count)
/* long code that makes the h in homeless cycle run for about 3 minutes, unrelated to the question */

所以基本上,视图显示 request.session.get('technical', ''),但是两个函数在完成之前都不会写入它(然后它会写入有关处理最后一条记录的信息)。

会话在 modified 时或在您的设置中 settings.SESSION_SAVE_EVERY_REQUEST 设置为 True 时以 per-request 为基础保存。

所以简单的回答是,在处理视图创建的响应时,会话由会话中间件保存。但是您可以通过在视图中调用 request.session.save() 来手动完成。

如果您有运行很长时间的代码,最好立即创建响应并使用 celery 等工具异步处理您的任务。

如果数据与用户会话没有真正相关,您应该考虑将数据存储到自己的数据库table/自己的模型中。