javascript - 基于脚本进度的动态进度条?

标签 javascript python html json webapp2

我有一个 Google App Engine 应用程序,使用 webapp2 框架,与 MySQL 数据库交互。应用程序的用户可以上传数据。在上传过程中,我想显示一个进度条,因为它最多可能需要几分钟。
根据我在其他主题(主要是:this topicthis one)中看到的内容,我正在研究 JSON/Javascript 解决方案,这对我来说都是新的。

如果我传递一个随机数,进度条本身会起作用。但是,我不知道如何从 Python 脚本中“加载”不断变化的值。

这是 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 循环,该循环嵌入在加载页面的脚本中。脚本完成一项事件后,我希望将计数器的结果作为其宽度传递给进度条。对于静态变量,我使用常规的 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))

如何修改脚本使其正常工作?或者有更好的方法来解决这个问题吗?

最佳答案

您需要将“事件”的进度存储在函数之外的某处。

一个骇人听闻的“解决方案”是将它存储到某种缓存解决方案中,例如带有某种时间戳/签名的 memcached 或 redis,以便您可以检索它(并使用 cron 作业类型的东西使旧条目无效) .

或者您可以大展拳脚,让您的任务完全与 Celery 之类的东西异步,但我怀疑您能否在 Google App Engine 上做到这一点。

关于javascript - 基于脚本进度的动态进度条?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44318561/

相关文章:

python - 如何存储不可散列的对象

html - Firefox 不读取嵌套元素的背景

html - 如何在 angularjs Material 设计中创建固定页脚

javascript - Facebook 用户订阅源

javascript - 未捕获的ReferenceError : load is not defined

javascript - 正则表达式删除引号内的空格

按钮/点击事件上的 JavaScript 下拉列表

python - 在 Flask 中通过 SQL 数据库格式化表

python - 替换所有出现的特定单词

html - jquery 下拉导航栏中的额外空间