使用Django重定向并传递Celery任务数据

时间:2016-06-13 14:54:21

标签: django celery

我想使用django-celery构建一个以下的网络服务器:

  1. 在页面/input/
  2. 上接受用户提供的数据
  3. 启动Celery任务以处理它们
  4. 重定向到页面/wait/,用户等待处理完成
  5. 任务完成后,会自动重定向到页面/result/
  6. 目前我遇到了代码(简化):

    views.py

    def input(request):
        # Read form data to 'parameters'
        task = process_user_input.delay(parameters)
        response = HttpResponseRedirect("/wait")
        response.session['task'] = task
        return response
    
    def wait(request):
        task = request.session.get('task', None)
        while task.state not in ('SUCCESS', 'FAILURE'):
            time.sleep(0.1)
        return HttpResponseRedirect("/result")
    
    def result(request):
        # 
    

    urls.py

    urlpatterns = patterns('',
        url(r'^input/$', views.input, name = 'input'),
        url(r'^wait/$', views.wait, name = 'wait'),
        url(r'^result/$', views.result, name = 'result'),
    )
    

    然而,这不起作用,'HttpResponseRedirect' object has no attribute 'session'。我也尝试使用render函数,但它只加载相应的模板而不调用视图函数。

    有人可以帮我修改代码,以便达到我的目标吗?

1 个答案:

答案 0 :(得分:1)

经过一些研究后,我得出结论,我得出的结论是django不提供所需的功能,因为人们无法异步呈现页面(因此,无法同时呈现和重定向) )。因此,我决定摆脱/wait/页面。我的views.py现在看起来像这样:

from my_app.forms import InputForm
from mysite.tasks import process_user_input

def input(request):
    form = InputForm()
    # Read form data to 'parameters'
    task = process_user_input.delay(parameters)
    while task.state not in ('SUCCESS', 'FAILURE'):
        time.sleep(0.1)
    if task.failed():
        # Insert error message and return to the input form
        render(request, 'my_app/input.html', {'form': form})
    return HttpResponseRedirect("/result")

def result(request):
    # 

我必须使用Javascript中的jQuery input.html实施等待消息:

<div id="form_container">
    <!--The form (with id="input_form") is here-->
</div>
<div id="hidden_section" style="display: none;">
    <!--The please-wait-message is here-->
</div>

<script>
$(document).ready(function () {
    $("#input_form").submit(function () {
        $("#form_container").attr("style", "display: none");
        $("#hidden_section").attr("style", "display: block");
        return true;
    });
});
</script>

因此,在提交表单后,用户仍然在/input/页面上,但看到请等待消息,直到任务完成或发生错误。