【问题标题】:Session values not saved until view returns在视图返回之前不保存会话值
【发布时间】:2013-04-10 21:24:39
【问题描述】:

我有一个 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

    ...

【问题讨论】:

    标签: python django session


    【解决方案1】:

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

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

    确实,您应该研究像 Celery 这样的东西来在请求周期之外执行长时间运行的进程。

    【讨论】:

      猜你喜欢
      • 2018-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-28
      • 2012-09-12
      相关资源
      最近更新 更多