基于脚本进度的动态进度条?
Dynamic progress bar based on progress of script?
我有一个 Google App Engine 应用程序,使用 webapp2 框架,与 MySQL 数据库交互。应用程序的用户可以上传数据。在上传过程中,我想显示一个进度条,因为它最多可能需要几分钟。
根据我在其他主题(主要是:this topic and this one)中看到的内容,我正在研究 JSON/Javascript 解决方案,这对我来说都是新的。
如果我传递的是随机数,进度条本身会起作用。但是,我不知道如何从 Python 脚本 'load' 更改值。
这是HTML/CSS/Javascript:
HTML:
<div id="myProgress">
<div id="myBar"</div>
</div>
CSS:
#myProgress {width: 300px;
height: 30px;
background-color: #ddd;
}
#myBar {width: 1%;
height: 30px;
background-color: #4CAF50;
}
Javascript:
<script type="text/javascript">
function move() {
var elem = document.getElementById("myBar");
var width = 1;
var id = setInterval(frame, 1000);
function frame() {
if (width >= 100) {
clearInterval(id);
}
else {
//var randomnumber = Math.floor(Math.random() * 100); --> works
var randomnumber = function update_values() {
$SCRIPT_ROOT = {{ script_root }};
$.getJSON($SCRIPT_ROOT+"/uploading",
function(data) {
$("#width").text(data.width+" %")
});
} ; --> this is wrong I assume
var width = randomnumber;
elem.style.width = width + '%';
}
}
}
window.onload=move();
</script>
进度来自 Python 中的 for 循环,它嵌入在加载页面的脚本中。脚本完成一个 activity 后,我希望将计数器的结果作为其宽度传递给进度条。对于静态变量,我使用常规的 Jinja 方式。
class UploadingpageHandler(webapp2.RequestHandler):
def get(self):
activities_list = [1,2,3,4,5,6,7,8,9,10]
counter = 0
script_root = 'localhost:10080'
for activity in activities_list:
counter = counter + 10
upload.do_stuff_in_some_function_with_MySQL()
obj = {
'width': counter
}
self.response.headers['Content-Type'] = 'application/json' --> this
self.response.out.write(json.dumps(obj)) --> and this is wrong I assume
template_vars = {
'script_root': script_root
}
template = jinja_environment.get_template('uploading.html')
self.response.out.write(template.render(template_vars))
如何修改脚本使其正常工作?或者有更好的方法解决这个问题吗?
您需要将 "activities" 的进度存储在函数之外的某处。
一个 hacky "solution" 是将它存储到某种缓存解决方案中,例如 memcached 或 redis 以及某种 timestamp/signature 以便您可以检索它(并使旧条目无效cron 作业类型的东西)。
或者您可以大展拳脚,让您的任务与 Celery 之类的东西完全异步,但我怀疑您能否在 Google App Engine 上做到这一点。
我有一个 Google App Engine 应用程序,使用 webapp2 框架,与 MySQL 数据库交互。应用程序的用户可以上传数据。在上传过程中,我想显示一个进度条,因为它最多可能需要几分钟。
根据我在其他主题(主要是:this topic and this one)中看到的内容,我正在研究 JSON/Javascript 解决方案,这对我来说都是新的。
如果我传递的是随机数,进度条本身会起作用。但是,我不知道如何从 Python 脚本 'load' 更改值。
这是HTML/CSS/Javascript:
HTML:
<div id="myProgress">
<div id="myBar"</div>
</div>
CSS:
#myProgress {width: 300px;
height: 30px;
background-color: #ddd;
}
#myBar {width: 1%;
height: 30px;
background-color: #4CAF50;
}
Javascript:
<script type="text/javascript">
function move() {
var elem = document.getElementById("myBar");
var width = 1;
var id = setInterval(frame, 1000);
function frame() {
if (width >= 100) {
clearInterval(id);
}
else {
//var randomnumber = Math.floor(Math.random() * 100); --> works
var randomnumber = function update_values() {
$SCRIPT_ROOT = {{ script_root }};
$.getJSON($SCRIPT_ROOT+"/uploading",
function(data) {
$("#width").text(data.width+" %")
});
} ; --> this is wrong I assume
var width = randomnumber;
elem.style.width = width + '%';
}
}
}
window.onload=move();
</script>
进度来自 Python 中的 for 循环,它嵌入在加载页面的脚本中。脚本完成一个 activity 后,我希望将计数器的结果作为其宽度传递给进度条。对于静态变量,我使用常规的 Jinja 方式。
class UploadingpageHandler(webapp2.RequestHandler):
def get(self):
activities_list = [1,2,3,4,5,6,7,8,9,10]
counter = 0
script_root = 'localhost:10080'
for activity in activities_list:
counter = counter + 10
upload.do_stuff_in_some_function_with_MySQL()
obj = {
'width': counter
}
self.response.headers['Content-Type'] = 'application/json' --> this
self.response.out.write(json.dumps(obj)) --> and this is wrong I assume
template_vars = {
'script_root': script_root
}
template = jinja_environment.get_template('uploading.html')
self.response.out.write(template.render(template_vars))
如何修改脚本使其正常工作?或者有更好的方法解决这个问题吗?
您需要将 "activities" 的进度存储在函数之外的某处。
一个 hacky "solution" 是将它存储到某种缓存解决方案中,例如 memcached 或 redis 以及某种 timestamp/signature 以便您可以检索它(并使旧条目无效cron 作业类型的东西)。
或者您可以大展拳脚,让您的任务与 Celery 之类的东西完全异步,但我怀疑您能否在 Google App Engine 上做到这一点。