I have a time consuming server side calculation, which is triggered by
edit-form submitting and can run up to several minutes (its a sports event
data recalculation if rules are changed). During this time I want to
receive messages via ajax from server and post them in a div for a progress
visualization. So far I`v done this using DB table for recording log
messages:
*db.py:*
#here I store messages
db.define_table('log', Field('message', 'string'))
*controller #1:*
def editForm():
...
if form.process().accepted:
event=db(db.event.id==request.get_vars.id).select().first()
recalculateEvent(event)
*myModel.py:*
#recalculation must be accessible from all controller files, so I put it in
a Model
import myModule
recalculateEvent(event):
db.log.truncate() #clear log
session._unlock(response) #without this, this function does not
allow functions in other controllers to run
db.log.insert(message='Starting Calculation')
db.commit() #if I do not commit after every
insert, messages do not appear in DB table
myModule.calculateSomeMoreData()
for p in players:
db.log.insert(message='Calculating player '+p.name)
db.commit()
...more calculations...
p.update_record()
*controller#2:*
#ajax calls this function every .5 seconds for messages
def getProgress():
m=' '.join([l.message for l in db(db.log).select()])
return json.dumps(dict(m=m))
*View, javascript:*
$("#submit_button").click(function(e){
$('#progress').show();
GetProgres();
$("#myForm").submit();
});
function GetProgres() {
$.ajax({
type: "POST",
url: '{{=URL('controller#2', 'getProgress')}}',
dataType: "json",
success: function(data) {
$('#progress').html(data.m);
setTimeout(function() { GetProgres(); }, 500);
},
error: function (xhr, ajaxOptions, thrownError){
alert(xhr.status);
alert(xhr.statusText);
alert(thrownError);
}
});
}
I have 2 problems with this:
1. Every other time web2py throws this error after recalculateEvent(event)
function completes:
Traceback (most recent call last):
File "gluon/main.py", line 576, in wsgibase
File "gluon/globals.py", line 749, in _try_store_in_cookie_or_file
File "gluon/globals.py", line 768, in _try_store_in_file
IOError: [Errno 13] Permission denied
If I remove db.log.insert+db.commit lines - no error. But how else can I
transfer live data between running real-time function in a model and
function in a controller? I tried storing messages in a session, but it
does not update until model function is finished.
2. Ajax call from view works only when hosting on my local machine and only
in Opera and IE. It does not call controller#2/getProgress function in
Chrome and Firefox on localhost. When hosting on outside server it does not
work on any browser... Only Firefox triggers ajax error, with
xhr.statusText='error'.
I guess this is something to do with that I`m triggering form submission,
calculation function and at the same time polling sever. But I have no idea
what to do.
May be if my approach is totally wrong somebody can suggest how to
implement this in other way.
--
---
You received this message because you are subscribed to the Google Groups
"web2py-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.