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

Django 函数结束前更新request.session变量,django,session-variables,Django,Session Variables,在Django服务器上,我有一个页面,其中有一个启动函数的按钮。 此函数需要一段时间才能完成,我尝试将进程更新写入request.session变量,目的是从单独的页面检查其内容。 但是,在完成包含request.session变量的函数之前,它们似乎不会更新。至少变量在此之前不会更新。 我说的对吗?如果是,是否有办法在函数完成之前写入request.session变量 会话设置正确,我可以使用其他示例编写和读取变量。现在,我还将创建一个临时数据库记录来存储状态更新信息并从那里读取,但对于这个请

在Django服务器上,我有一个页面,其中有一个启动函数的按钮。 此函数需要一段时间才能完成,我尝试将进程更新写入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, })
函数.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',''),但在它们完成之前,两个函数都不会写入它(然后它会写入关于处理最后一条记录的内容).

当会话被保存或设置为
settings时,会按每个请求保存会话。会话\u SAVE\u每个请求
在您的设置中设置为
True

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

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


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

< P>会话是在每次请求的基础上保存的,或者是在设置<代码>设置时。SESSIONSaveSeEvIX请求< /代码>在您的设置中被设置为<代码>真< /COD>。p> 因此,简单的答案是肯定的,在处理视图创建的响应时,会话由会话中间件保存。但您可以通过在视图中调用
request.session.save()
手动完成此操作

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


你应该考虑将数据存储到自己的数据库表/自己的模型中,如果它与用户会话没有真正的联系。

你应该在你的问题中包含A。发布您的观点和您已经尝试过的内容。那么提供答案就容易多了。@trixn抱歉,添加了信息。如果你有很长的计算要运行,你真的想使用一些异步任务系统(如芹菜、rq等)在带外运行它们。你应该在问题中包含一个。发布您的观点和您已经尝试过的内容。那么提供答案就容易多了。@trixn抱歉,添加了信息。如果你有长时间的计算要运行,你真的想使用一些异步任务系统(如芹菜、rq等)在带外运行它们。太好了,这很有效。非常感谢,我自己无法从文档中看出这一点!至于芹菜和db,是的,我同意。这真的只是一个快速修复,我需要一个单独的任务,所以我只是想快速更新。芹菜肯定会更好,但我还没学会用它。教程放在书签栏里,所以我希望我很快就会看到。太好了,这很有效。非常感谢,我自己无法从文档中看出这一点!至于芹菜和db,是的,我同意。这真的只是一个快速修复,我需要一个单独的任务,所以我只是想快速更新。芹菜肯定会更好,但我还没学会用它。教程放在书签栏里,所以我希望我很快就会看到。