使用 Django 重定向和传递芹菜任务数据



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

  1. 接受来自用户在页面上的数据/input/
  2. 启动Celery任务来处理它们
  3. 重定向到页面/wait/,用户在其中等待处理完成
  4. 任务完成后,自动重定向到页面/result/

目前我卡在代码上(简化):

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函数,但它只加载相应的模板而不调用视图函数。

有人可以帮助我修复代码以实现我的目标吗?

经过一些研究,我得出的结论是,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):
    # 

我必须使用 Javascriptinput.html 中的jQuery实现的等待消息:

<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/页面上,但看到请等待消息,直到任务完成或发生错误。

相关内容

  • 没有找到相关文章

最新更新