【问题标题】:Django 1.9 show a countdown for HttpResponse/Render responseDjango 1.9 显示 HttpResponse/Render 响应的倒计时
【发布时间】:2016-01-08 04:28:55
【问题描述】:

我正在编写一个代码,用户可以在其中从浏览器管理服务器(AWS 实例)。服务器需要一段时间才能启动,我想进行实时倒计时,以便用户知道要等待多长时间才能打开所有服务器。

这是我的views.py代码

def startservers(request, question_id):
    inst() #updates all instance status
    if instance1[0].state in 'stopped':
        instance1[0].start()
    if instance2[0].state in 'stopped':
        instance2[0].start()
    if instance3[0].state in 'stopped':
        instance3[0].start()
    if instance4[0].state in 'stopped':
        instance4[0].start()
    for i in range (10,0,-1):
        print 'Wait for %d seconds \r' % i,
        sys.stdout.flush()
        time.sleep(1)
    check() #makes sure all instances are running
    text1 = 'WebServer-Test %s' % instance1[0].state
    text2 = 'Gluster %s' % instance2[0].state
return render(request, 'awsservers/startservers.html', {'webstatus': text1, 'glu1status': text2})

我不确定我应该如何将倒计时值解析为

  return render(request, 'awsservers/startservers.html', {'webstatus': text1, 'glu1status': text2})

为了更好地理解我所说的实时倒计时,您可以在控制台上运行这部分代码以查看它产生的输出。

for i in range (10,0,-1):
        print 'Wait for %d seconds \r' % i,
        sys.stdout.flush()
        time.sleep(1)
print '' #without this, next line prints onto the same line as "Wait for.."
print "Server1 running"
print "Server 2 running"

感谢您的帮助!

如果有人知道更好的倒计时方法,请告诉我!

【问题讨论】:

  • 您需要使用Javascript在浏览器上运行倒计时。
  • @MuhammadTahir javascript 如何知道现在实际运行的是哪个状态?

标签: python django django-1.9


【解决方案1】:

一种简单的方法是通过 ajax。使用 javascript 每秒调用一次您的方法并显示响应。 在这种情况下,您可能不需要服务器端的循环,只需返回状态...如果服务器已启动,则显示适当的文本,如果不显示倒计时。

JavaScript 代码将是这样的

var i = 10;
var timer = window.setInterval(function(){
  $.ajax({
    url: // your url
    data: // any parameters you need to pass as JSON
    success: function(response){
        if (response == 'started'){
            $('#server_status').text('Wait for ' + i + ' seconds')
            i--;
        }else
            $('#server_status').text('running')
  }});
  if (i == 0)
        window.clearInterval(timer);
}, 1000);   // Repeat every 1 second

请注意,我使用 JQuery 进行 ajax 调用

另一种方法可能是使用StreamingHttpResponse

在这种情况下,你的循环应该被分成一个方法,返回的值应该被发送到 html 页面或作为响应

def count_seconds():
    for i in range (10,0,-1):
        time.sleep(1)
        yield 'Wait for %d seconds \r' % i,

yield 关键字在每次调用函数时都会返回第 i 个值。

【讨论】:

  • 我同意;但是如果我们想要每秒更新一次,我们必须每秒检查一次
  • 嗯,有一个叫做 websockets 的选项...它有点容易设置...结果你会同意
  • 抱歉,回复晚了,我确实最终使用了 AJAX,但时间间隔对我来说不合适,所以我最终使用了一个按钮点击,它工作正常!。我会接受您指导我使用 AJAX 的回答 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-18
  • 2017-11-05
  • 1970-01-01
  • 1970-01-01
  • 2017-04-21
相关资源
最近更新 更多