我想使用django-celery
构建一个以下的网络服务器:
/input/
Celery
任务以处理它们/wait/
,用户等待处理完成/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
函数,但它只加载相应的模板而不调用视图函数。
有人可以帮我修改代码,以便达到我的目标吗?
答案 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/
页面上,但看到请等待消息,直到任务完成或发生错误。