如何在Django中创建一个等待页面

时间:2011-12-14 21:48:04

标签: ajax django jquery

我正在构建一个需要冗长计算的应用程序。用户提交信息后,需要大约30分钟来计算,然后返回结果。所以我正在考虑添加一个“请稍候”页面。

我按照以下链接中提到的说明操作, http://groups.google.com/group/django-users/browse_thread/thread/c1b0d916bbf86868 但是,当我提交某些内容时,它会保留在http://127.0.0.1:8000/please_wait 并且不会重定向到http://127.0.0.1:8000/display_DHM

之类的结果页面

有人知道发生了什么吗?

以下是所有相关文件,我尝试了各种方法,但是当我 提交表单,它只返回please_wait页面,然后留在那里 永远。没有重定向发生。 因为我想检查它是否先工作,所以没有实际的 在代码中计算。

url.py

urlpatterns = patterns('',
       (r'^test$',views.test_form),
       (r'^please_wait', views.please_wait),
   url(r'^run_DHM$', views.run_DHM, name="run_DHM") ,
   url(r'^displayDHM', views.display_DHM, name="displayDHM")
)

view.py

def test_form(request):
       return render_to_response('test.html')

def please_wait(request):
       return render_to_response('please_wait.html')

def run_DHM(request):
      ### lengthy calculations... ...
       return HttpResponse("OK")

def display_DHM(request):
   return render_to_response('display_DHM.html')

的test.html

{% extends "baseFrame.html" %}

{% block maincontent %}
 <form method="POST" action="please_wait">
  <p>Test:</p>
  <div id="address"></div>
  <p>Type your value in here:</p>
  <p><textarea name="order" rows="6" cols="50" id="order"></
textarea></p>
  <p><input type="submit" value="submit" id="submit" /></p>
 </form>
{% endblock %}

please_wait.html

<html>Please wait
<script type="text/javascript" src="http://code.jquery.com/
jquery-1.7.1.min.js">
$.getJSON('{% url run_DHM %}', function(data) {
       if (data == 'OK') {
                 window.location.href = '{% url displayDHM %}';
           } else {
                 alert(data);
           }
   });
</script>
</html>

display_DHM.html

<HTML>
<BODY>END FINALLY!</BODY>
</HTML>

2 个答案:

答案 0 :(得分:1)

我在这里写,因为我无法使用评论空间。我的question与你的有点类似,也许答案可以帮到你。

简言之:

问题:

  

我有一个名为c.py的外部python程序,其中&#34;计数&#34;最多20秒。我从我的Django应用程序views.py中调用它,在html页面中我有一个按钮来启动它。没关系(=在Eclipse中我可以看到当我按下网页上的按钮时c.py打印0,1,2,3,... 20)但我希望按钮从&#更改34; GO&#34;到&#34;等待&#34;在c.py过程中(或者我想在计数过程中执行等待页面或弹出窗口)。

答案:

  

您需要能够向客户端报告c的状态   通过ajax长轮询或WebSockets,或者,如果你不关心   c的增量状态,只想更改链接的文本,   你需要使用JavaScript来设置click事件时的值   链接火了:

<强> views.py

from django.core.urlresolvers import reverse
from django.http import JsonResponse

def conta(request):
    c.prova(0)
    redirect = reverse('name_of_home_user_view')
    return JsonResponse({'redirect': redirect})

js

// assuming jQuery for brevity...

$(document).ready(function() {

    // avoid hard-coding urls...
    var yourApp = {
        contaUrl: "{% url 'conta' %}"
    };

    $('#btnGo').click(function(e) {
        e.preventDefault();  // prevent the link from navigating

        // set css classes and text of button
        $(this)
            .removeClass('btn-primary')
            .addClass('btn-danger')
            .text('WAIT');

        $.get(yourApp.contaUrl, function(json) {
             window.top = json.redirect;
        });
    });
});

答案 1 :(得分:0)

如果您需要冗长的计算,我认为您可能对celery感兴趣。好的等待页面(进度指标?)将是副产品。