def getprogress():
print "getprogress:", session.progress
return session.progress
This one takes 5 seconds to perform and changes session.progress each time.
def progress():
# when a form is submitted, change progress each second
if request.post_vars:
for i in range(5):
session.progress = i
print "main:", session.progress
sleep(1)
return "done"
else:
session.progress = -1
return locals()getprogress: -1
getprogress: -1
main: 0
getprogress: -1
main: 1
getprogress: -1
main: 2
getprogress: -1
main: 3
getprogress: -1
main: 4
getprogress: -1Im trying to make a progress bar by reading and writing a session variable:
There are 2 controllers:
Get session.progressdef getprogress():
print "getprogress:", session.progress
return session.progress
This one takes 5 seconds to perform and changes session.progress each one.
def progress():
# when a form is submitted, change progress each second
if request.post_vars:
for i in range(5):
session.progress = i
# Write to the session file and unlock/close it.
session._try_store_in_file(request, response)
print "main:", session.progress
sleep(1)
# Re-open and re-lock the session file.
session.connect()
return "done"
else:
session.progress = -1
return locals()
Perhaps you should update a field in some db table and use it instead of session.
Perhaps you should update a field in some db table and use it instead of session.
Please note that the end of this, is to create an ajax progress bar that indicates the numbers of records being inserted on a request.
Although that might work as well, still it isnt good to read and write a record each second (progress update interval) when im performing the insertion of 30k records.
def getprogress():
print "progress", cache.ram.storage['message'][1]
return cache.ram.storage['message'][1]def progress():
# when a form is submitted, change progress each second
if request.post_vars:
for i in range(5):
message = cache.ram('message', lambda: i, time_expire=1)
print "main:", message
sleep(1)
return "done"
else:
message = cache.ram('message', lambda: -1, time_expire=1)
return locals()
print "progress", cache.ram.storage['message'][1]
doesnt get printed on its own line, but the important thing is that im not accessing the declared message value.
And i get a log like this
progress progress progress progress main: 0
progress main: 1
progress progress progress main: 2
progress main: 3
progress main: 4
progress
return cache.ram.storage['message'][1]
return cache.ram('message', lambda: None, None)def progress():
# when a form is submitted, change progress each second
if request.post_vars:
for i in range(5):
message = cache.ram('message', lambda: i, time_expire=1)
message = cache.ram('message', lambda: i, time_expire=0)
progress -1
progress -1
main: 0
progress 0
main: 1
progress 1
main: 2
progress 2
main: 3
progress 3
main: 4
progress 4def getprogress():
return cache.ram('message', lambda: None, None)
def progress():
# when a form is submitted, change progress each second
if request.post_vars:
n = 20 #simulate 20 iterations
for i in range(n):
msg = "Inserting records"
percent = 100*(i+1) / n
#update the percent each 5%
if percent % 5 == 0:
#store the array in ram [percent, text msg]
message = cache.ram('message', lambda: ";".join([percent, msg]), time_expire=0)
print "main:", percent, message
sleep(1)
#we are calling this controller through ajax so return a string when done
return "done"
else:
message = cache.ram('message', lambda: -1, time_expire=0)
return locals()
<div class="well">
<div id="pbar">
<div class="row">
<div class="col-md-12">
<h3>Processing...</h3>
</div>
<div class="col-md-12">
<div class="progress progress-bar-xl" style="margin-top: 3px">
<div class="progress-bar progress-bar-warning" role="progressbar" aria-valuenow="60" aria-valuemin="0" aria-valuemax="100" style="width: 0%;">0%</div>
</div>
</div>
</div>
<div class="row">
<!-- <div class="col-md-1">
<input id="start" value="Pause" class="input-sm btn btn-primary btn-gradient btn-block dark" style="line-height: 0.8em;padding: 0" type="submit">
</div>
<div class="col-md-1">
<input id="abort" value="Abort" class="input-sm btn btn-danger btn-gradient btn-block dark" style="line-height: 0.8em;padding: 0" type="submit">
</div> -->
</div>
</div>
</div>
<script type="text/javascript">
function ProgressBar (selector) {
var self = this;
self.el = $(selector)
self.text = self.el.find("h3");
self.progress = self.el.find(".progress-bar");
self.btnstart = self.el.find("#start");
self.btnabort = self.el.find("#abort");
self.value = 0;
self.min = 0;
self.max = 100;
self.interval = 5000;
self.running = false;
self.timer = null;
self.offset = 0;
self.set_progress = function (value) {
value = value || 0;
var done = false;
if (value>=self.max) {
value = self.max
done = true;
};
value = parseInt(value) + "%";
self.progress.css("width", value);
self.progress.text(value);
if (done) self.done();
};
self.done = function (msg) {
var msg = msg || "Process Completed"
self.text.text(msg)
console.log("done", self.timer);
clearInterval(self.timer);
self.running = false;
};
self.abort = function (e) {
if (self.running) {
self.value = 0;
self.set_progress(0);
self.text.text("Aborted");
if (self.timer) {
clearInterval(self.timer);
};
self.running = false;
};
}
#ask the server for the progress
self.ask = function () {
var ask = $.ajax({
url: window.location.origin + "/default/getprogress"
, type: "get"
});
ask.done(function (res, msg, xhr) {
console.log(res);
if (res=="-1") {
console.log("not running...?");
self.done();
return
}
// var data = res.split(";");
var percent = parseInt(res[0]);
var msg = res[1];
// if (msg == "Error") {
// return self.done(msg);
// };
self.text.text(msg);
// console.log("resp", res);
self.value = percent + self.offset;
if (percent == 80 && self.offset < 10) {
self.offset +=0.5;
}
if (percent == 80 && self.offset >= 10 && self.offset < 15) {
self.offset +=0.1;
}
self.set_progress(self.value);
});
ask.fail(function (xhr, status, error) {
var resp = xhr.responseText;
self.done("Error (see browser's console for details)");
if (console) {
console.log(resp);
};
// console.log(resp);
// console.log(status);
// console.log(error);
// clearInterval(self.timer);
// self.running = false;
})
};
self.start = function (e) {
self.text.text("Processing...");
if (!self.running) {
console.log("running");
self.value = 0;
self.set_progress();
self.ask();
self.timer = setInterval(self.ask, self.interval);
self.running = true
} else {
console.log("already runing");
}
}
self.set_progress(self.value);
// self.btnstart.on("click", self.start);
// self.btnabort.on("click", self.abort);
}
var pbar = new ProgressBar("#pbar");
pbar.start();# Progress bar example:
# Thanks to Alfonso Serra
# See: https://groups.google.com/d/msg/web2py/zgSLxeg7avw/JvPidEBMAQAJ
import time
import threading
def update_progress(n):
for i in range(n):
msg = "Working"
percent = 100*(i+1) / n
progress_data = cache.ram('progress_data',
lambda: dict(percent=percent, msg=msg),
time_expire=0)
print "progress:", progress_data
time.sleep(1)
def progress():
# when a form is submitted, change progress each second
a_form = SQLFORM.factory(Field('some_field'))
if request.post_vars:
threading.Thread(target=update_progress, args=[20]).start()
else:
progress_data = cache.ram('progress_data',
lambda: dict(percent=(-1), msg='Ready'),
time_expire=0)
return locals()
def getprogress():
progress_data = cache.ram('progress_data', lambda: None, None)
print "getprogress:", progress_data
return progress_data
{{extend 'layout.html'}}
{{=a_form}}
<div class="container-fluid">
<div id="pbar">
<div class="row">
<div class="col-md-12">
<h3 id="pbar_status">Ready...</h3>
</div>
<div class="col-md-12">
<div class="progress progress-bar-xl"
style="margin-top: 3px">
<div class="progress-bar progress-bar-warning"
role="progressbar"
aria-valuenow="60"
aria-valuemin="0"
aria-valuemax="100"
style="width: 0%;">0%</div>
</div>
</div>
</div>
</div>
</div>
<script type="text/javascript">
function ProgressBar (selector) {
self = this
self.el = $(selector)
self.text = self.el.find("#pbar_status");
// ask the server for the progress
self.ask = function () {
var ask = $.ajax({
type: "GET",
url: window.location.origin + "{{=URL('getprogress.json')}}",
dataType: "json",
});
ask.done(function (json) {
console.log(json);
var percent = parseInt(json.percent);
var msg = json.msg;
if (percent == -1) {
console.log(msg);
return;
};
self.text.text("Processing...");
self.text.text(msg);
self.value = percent + self.offset;
self.set_progress(self.value);
});
ask.fail(function (xhr, status, error) {
var resp = xhr.responseText;
self.done("Error (see browser's console for details)");
if (console) {
console.log(resp);
};
});
};
self.start = function (e) {
if (self.running) {
console.log("already runing");
} else {
console.log("running");
self.value = 0;
self.set_progress();
self.ask();
self.timer = setInterval(self.ask, self.interval);
self.running = true
};
};
self.set_progress(self.value);
}
// start here
$(function() {
var pbar = new ProgressBar("#pbar");
pbar.start();
})
</script>