There's a simple workaround for this problem. I've tested it and it
works fine. The concept is that I have to make the ajax request
synchronous. For this purpose I've used the jQuery.ajax function
instead of the web2py supplied one and I had to put everythin inside a
queue. The code in my first post was rewritten like this:
function dvd() {
$.ajax({
async: false,
url: 'bg_quick_dvd',
data: {
keyword: $('#keyword').val(),
option: $('#option').val()
},
type: 'POST',
success: function(data){
$('div#target_dvd').html(data);
}
})
queue_start();
}
function music_cd() {
$.ajax({
async: false,
url: 'bg_quick_music_cd',
data: {
keyword: $('#keyword').val(),
option: $('#option').val()
},
type: 'POST',
success: function(data){
$('div#target_music_cd').html(data);
}
})
queue_start();
}
function book() {
$.ajax({
async: false,
url: 'bg_quick_book',
data: {
keyword: $('#keyword').val(),
option: $('#option').val()
},
type: 'POST',
success: function(data){
$('div#target_book').html(data);
}
})
}
var queue = [];
function start() {
if(jQuery('#title').attr('checked'))
jQuery('#option').val('1');
if(jQuery('#store').attr('checked'))
jQuery('#option').val('0');
queue.push(book);
queue.push(music_cd);
queue.push(dvd);
queue_start();
}
function queue_start() {
if(queue.length > 0) {
var fn = queue.pop();
fn();
}
}
On Jun 24, 7:14 pm, ScOut3R <[email protected]> wrote:
> Dear List,
>
> theajaxbasedbackgroundsearch crashes my web2py installation. It's
> version 1.77.3 and I'm using the fcgihandler to access the
> application. OS: OpenBSD 4.6, Python version is Python 2.5.4
> (r254:67916, Oct 19 2009, 01:52:14).
>
> As You can see below the search makes three database queries. The
> first search attempt works and the second crashes web2py. Would You be
> so kind to look into it?
>
> The error is the following:
>
> Unhandled exception in thread started by <bound method Connection.run
> of <gluon.contrib.gateways.fcgi.Connection object at 0x8b5af36c>>
> Traceback (most recent call last):
> File "/var/www/web2py/prod/gluon/contrib/gateways/fcgi.py", line
> 664, in run
> self.process_input()
> File "/var/www/web2py/prod/gluon/contrib/gateways/fcgi.py", line
> 700, in process_input
> self._do_params(rec)
> File "/var/www/web2py/prod/gluon/contrib/gateways/fcgi.py", line
> 799, in _do_params
> self._start_request(req)
> File "/var/www/web2py/prod/gluon/contrib/gateways/fcgi.py", line
> 783, in _start_request
> req.run()
> File "/var/www/web2py/prod/gluon/contrib/gateways/fcgi.py", line
> 592, in run
> self._flush()
> File "/var/www/web2py/prod/gluon/contrib/gateways/fcgi.py", line
> 599, in _flush
> self.stdout.close()
> File "/var/www/web2py/prod/gluon/contrib/gateways/fcgi.py", line
> 358, in close
> self._conn.writeRecord(rec)
> File "/var/www/web2py/prod/gluon/contrib/gateways/fcgi.py", line
> 715, in writeRecord
> rec.write(self._sock)
> File "/var/www/web2py/prod/gluon/contrib/gateways/fcgi.py", line
> 552, in write
> self._sendall(sock, header)
> File "/var/www/web2py/prod/gluon/contrib/gateways/fcgi.py", line
> 529, in _sendall
> sent = sock.send(data)
> socket.error: (32, 'Broken pipe')
>
> The jquery snippet that calls thebackgroundfunctions:
>
> function dvd() {ajax('bg_quick_dvd', ['keyword', 'option'],
> 'target_dvd'); }
> function music_cd() {ajax('bg_quick_music_cd', ['keyword', 'option'],
> 'target_music_cd'); }
> function book() {ajax('bg_quick_book', ['keyword', 'option'],
> 'target_book');
>
> function start() {
> if(jQuery('#title').attr('checked'))
> jQuery('#option').val('1');
> if(jQuery('#store').attr('checked'))
> jQuery('#option').val('0');
>
> dvd();
> setTimeout('music_cd()', 150);
> setTimeout('book()', 300);
>
> }
>
> And the backround functions:
>
> def bg_quick_dvd():
> if (request.vars.option == '1'):
> pattern = '%' + request.vars.keyword + '%'
> dvds = db((db.dvds.user==user_id) &
> (db.dvds.title.like(pattern))).select(orderby=db.dvds.title)
> else:
> dvds = db((db.dvds.user==user_id) &
> (db.dvds.store==request.vars.keyword)).select(orderby=db.dvds.title)
> items = [A(row.title, _href=URL(c='dvd', r=request, f='show',
> args=row.id)) for row in dvds]
> return UL(*items).xml()
>
> @auth.requires_login()
> def bg_quick_music_cd():
> if (request.vars.option == '1'):
> pattern = '%' + request.vars.keyword + '%'
> music_cds = db((db.music_cds.user==user_id) &
> (db.music_cds.title.like(pattern))).select(orderby=db.music_cds.title)
> else:
> music_cds = db((db.music_cds.user==user_id) &
> (db.music_cds.store==request.vars.keyword)).select(orderby=db.music_cds.tit
> le)
> items = [A(row.title, _href=URL(c='music_cd', r=request, f='show',
> args=row.id)) for row in music_cds]
> return UL(*items).xml()
>
> @auth.requires_login()
> def bg_quick_book():
> if (request.vars.option == '1'):
> pattern = '%' + request.vars.keyword + '%'
> books = db((db.books.user==user_id) &
> (db.books.title.like(pattern))).select(orderby=db.books.title)
> else:
> books = db((db.books.user==user_id) &
> (db.books.store==request.vars.keyword)).select(orderby=db.books.title)
> items = [A(row.title, _href=URL(c='book', r=request, f='show',
> args=row.id)) for row in books]
> return UL(*items).xml()
>
> Best regards,
> Mate