【问题标题】:How to create a waiting page in Django如何在 Django 中创建等待页面
【发布时间】:2011-12-14 21:48:04
【问题描述】:

我正在构建一个需要长时间计算的应用程序。用户提交信息后,大约需要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>

【问题讨论】:

  • 您应该将此进程移至后台,将其加入队列或类似的事情。芹菜是做到这一点的正确方法。你也可以使用线程。

标签: ajax django jquery


【解决方案1】:

我写在这里是因为我不能使用评论空间。我的question 和你的有点相似,也许答案可以帮助到你。

简单地说:

问题:

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

答案:

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

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

【讨论】:

  • 如果您有新问题,请点击 按钮提出问题。如果有助于提供上下文,请包含指向此问题的链接。
  • @Maxime Rouiller:我没有足够的声誉来发表评论,所以我发布了我的问题的答案,不是为了获得更多答案,而是因为我认为它的答案可能对这个问题有用。我说的不对?
  • 经过审查,是的。这是一种系统的失败。但是在查看了您给出的广泛答案之后,无论如何它都不适合发表评论。我建议您添加一些这样的好答案,并获得评论所需的 50 声望。已为您点赞。
【解决方案2】:

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

【讨论】:

  • 谁能举一些例子来说明如何做到这一点?我对ajax、芹菜一无所知......
猜你喜欢
  • 2015-05-04
  • 2021-11-07
  • 1970-01-01
  • 2016-08-23
  • 1970-01-01
  • 2021-12-17
  • 2010-11-22
  • 2017-05-06
  • 2013-11-02
相关资源
最近更新 更多