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