代码之家  ›  专栏  ›  技术社区  ›  Vémundr

更新请求。函数结束前的会话变量

  •  0
  • Vémundr  · 技术社区  · 8 年前

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

    会话设置正确,我可以使用其他示例编写和读取变量。现在,我还将创建一个临时db记录来存储状态更新信息并从中读取,但我对这个请求很好奇。会话的事情-我的猜测正确吗,有没有办法?

    更新:

    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 回复  |  直到 8 年前
        1
  •  3
  •   trixn    8 年前

    会话在以下情况下按每个请求保存: modified 或者当设置 settings.SESSION_SAVE_EVERY_REQUEST 设置为 True 在您的设置中。

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

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

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