在视图返回之前,会话值不会保存

时间:2013-04-10 13:07:33

标签: python django session

我有一个Django Form,在提交后会调用相当耗时的操作。此操作(Python函数)可以随时创建数据。

创建相关数据后,我想将其存储到活动session,以便用户可以在生成结果时看到结果(现在通过简单的刷新)。

我写了一个模板,显示session的表单和所有当前字段。但是,似乎会话仅在长时间运行的函数返回时保存为完整(在执行期间刷新页面时不显示任何已修改的组件)。从When sessions are saved开始,我被认为会在修改字典后立即更新会话。

我是否误解了如何保存会话?或者,还有另一种方法来实现我正在寻找的东西吗?


以下是相关views.py代码的摘要:

def my_form(request):
    """ Render the form, with any results included below. """
    if request.method == "POST":
        form = MyForm(request.POST)
        if form.is_valid():
            request.session.clear()
            long_running_func(request.session, form)
    else:
        form = MyForm()
    return render_to_response('my_form.html', {'form': form,
                                               'session': request.session})

def long_running_func(session, form):
    session["status"] = "Executing"

    result_data = long_running_task()
    session["results"] = result_data

    ...

1 个答案:

答案 0 :(得分:2)

你误解了这个链接。它没有说每次修改字典时都会保存会话。相反,会话保存基于请求:文档只是解释即使在完整的请求/响应周期内,如果尚未分配字典,也不会修改它。

您可能希望查看上面的部分,使用视图外的会话,以了解如何手动更新会话。但是,我必须说我认为您的设计存在缺陷:我无法看到用户应该如何查看更新的会话值。您的表单处理是在原始请求过程中完成的,刷新只会中断该操作,可能会使任务未完成。

实际上,你应该研究像Celery这样的东西,以便在请求周期之外执行长时间运行的进程。