我有这样的观点:
def form1(request):
if request.method == 'POST':
form = SyncJobForm(request.POST)
if form.is_valid():
# do something
in_progress = True
return render_to_response('form1.html', {'in_progress': in_progress})
我想知道如何在完成视图过程后将其设置为刷新模板。就像在完成页面后渲染页面一样:
in_progress = True
return render_to_response('form1.html', {'in_progress': in_progress})
# after its finished
finished = True
return render_to_response('form1.html', {'finished': finished})
我该如何实现这样的东西?提前谢谢。
答案 0 :(得分:2)
您无法在全局范围内维护页面调用之间的状态,因此您需要将数据存储在数据库中。此外,视图在返回页面后无法与浏览器协商任何内容,因此您需要将其拆分为多个视图并为作业生成单独的线程。以下是可能有所帮助的概要:
def do_something():
my_job = Jobs.get(id=blah)
my_job.in_progress = True
my_job.save()
# Do some stuff here....
my_job.in_progress = False
my_job.save()
def step1(request):
in_progress = Jobs.get(id=blah).in_progress
if not in_progress:
if request.method == 'POST':
form = SyncJobForm(request.POST)
if form.is_valid():
thread.start_new_thread(do_something)
return HttpResponseRedirect(step2)
else:
return render_to_response('form.html', 'form': form)
else:
form = SyncJobForm()
return render_to_response('form.html', 'form': form)
else:
return HttpResponseRedirect(step2)
def step2(request):
in_progress = Jobs.get(id=blah).in_progress
if in_progress:
return render_to_response('in_progress.html')
else:
return HttpResponseRedirect(finished)
def finished(request):
return render_to_response('finished.html')
然后让您的页面in_progress.html
定期刷新页面。作业完成后,您可以在finished.html
。
有更复杂的方法可以执行此操作(编写Javascript以定期轮询服务器),但您仍需要编写单独的视图以响应相应的信息。此外,您可以使用Celery之类的作业管理框架来创建和执行作业,但是您仍然需要创建单独的视图来处理状态信息。
答案 1 :(得分:0)
如果没有来自客户端的某种回调,我无法想到这样做(除非你使用一些我不熟悉的异步服务器机制)。一种方法是让客户端在收到“in_progress”通知后定期轮询服务器,以查看处理是否已完成。服务器端可以分为两个调用,第一个用于处理问题中显示的POST
,另一个用于查找和报告给定任务是否已完成。