Django 1.9 显示 HttpResponse/Render 响应的倒计时

Django 1.9 show a countdown for HttpResponse/Render response

我正在编写一个代码,用户可以在其中通过浏览器管理服务器(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"

感谢您的帮助!

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

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

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

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

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

每次调用函数时,yield关键字都会return第i个值。