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

时间:2017-01-31 11:08:07

标签: django session-variables

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

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

更新:

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',''),但是在它们完成之前,两个函数都没有写入它(然后写入处理最后一条记录)。

1 个答案:

答案 0 :(得分:2)

会话在modified时或在您的设置中将settings.SESSION_SAVE_EVERY_REQUEST设置为True时,会根据每个请求进行保存。

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

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

如果与用户会话无关,那么您应该考虑将数据存储到自己的数据库表/自己的模型中。