代码之家  ›  专栏  ›  技术社区  ›  Ruben Quinones

Django中的刷新模板

  •  4
  • Ruben Quinones  · 技术社区  · 14 年前

    我有这样的看法:

    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})
    

    如何实现这样的功能?提前谢谢。

    2 回复  |  直到 14 年前
        1
  •  2
  •   Daniel Naab    14 年前

    不能在全局基础上维护页调用之间的状态,因此需要将数据存储在数据库中。此外,视图返回页面后无法与浏览器协商任何内容,因此需要将其拆分为多个视图,并为作业生成单独的线程。下面是一个可能有用的概述:

    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 创建和执行作业,但仍然需要创建单独的视图来处理状态信息。

        2
  •  0
  •   Manoj Govindan    14 年前

    如果没有来自客户机的某种回调,我无法考虑这样做(除非您使用某种异步服务器机制,这是我不熟悉的)。一种方法是让客户机在收到“正在进行”通知后定期轮询服务器,以查看处理是否已完成。服务器端可以分成两个调用,首先处理 POST 如你的问题和另一个问题所示,找出并报告一个给定的任务是否完成。