0

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

    ...
4

1 回答 1

2

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

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

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

于 2013-04-10T13:24:39.607 回答