[python] cherrypy + ajax
    Marek Palatinus 
    marek na palatinus.cz
       
    Pondělí Duben 21 10:28:29 CEST 2008
    
    
  
2008/4/21 Jaroslav Lukesh <lukesh na seznam.cz>:
> Ajax není PUSH, ale PULL
Jde to jednoduse nasimulovat:
V JS udelejte bezny setInterval s periodou cca 1s (klidne i mene), ve volane
funkci vytvarejte request na serveru.
V pythonu na serveru po requestu z javascriptu zkontrolujte, jestli se
provedla ta akce, na kterou javascript ceka. Pokud ne, pockejte sekundu
(klidne i mene) a test opakujte max x-krat, pote v nejhorsim vratte prazdny
request. Jedina nevyhoda toho mechanismu je vyssi pocet connection na
serveru pri paralelnim pristupu k aplikaci (request neni vyrizen behem
0.00nic sekundy, ale muze tam viset treba 10 sekund), zato efekt je super -
pouzivam to u sveho ajax vieweru logu apache2.
Na zaver prikladam kus kodu (psano pomoci jQuery a Pythonu) pod licenci
"delejte si s tim co chcete" :-) :
//funkce volana po 100ms v javascriptu, ziskava XML a parsuje do stranky
function checkLog() {
    user = $('#seluser').val()
    log = $('#sellog').val()
    if(!user || !log || working) return;
    $('#status').text('reading...')
    working = true
$.get('log.py/show?user='+user+'&log='+log+'&size='+size+'&filter='+$('#filter').val(),
function(data) {
        working = false
        $('#logarea').prepend($('data', data).text())
        if($('#logarea').text().length > 1000000) {
            $('#logarea').text($('#logarea').text().substr(0,900000))
        }
        size = $('size', data).text()
        $('#status').text('')
    })
}
# funkce v pythonu resici HTTP pooling, vraci data pokud jsou, jinak ceka
par sekund
def show(req, user, log, size, filter):
    global logpath
    if user == '_master':
        logfile = "%s/%s"%(logpath, log)
    else:
        logfile = "%s/%s/%s"%(logpath, user, log)
    fp = open(logfile, 'r')
    size = int(size)
    if size == 0:
        size = os.path.getsize(logfile)
        size -= min(size, 3000)
        fp.seek(size)
        lines = _readlinesWait(fp, filter)
        del lines[0]
    else:
        fp.seek(size)
        lines = _readlinesWait(fp, filter)
    size = os.path.getsize(logfile)
    fp.close()
    ret = ''
    for l in lines:
        ret = "%s%s"%(l, ret)
    return "<xml><size>%s</size><data>%s</data></xml>"%(size, ret)
def _readlinesWait(fp, filter):
    tries = 5
    while(tries):
        tmp = fp.readlines()
        lines = []
        for l in tmp:
            if filter != '' and l.find(filter) == -1:
                continue
            if l.find('log.py/') == -1:
                lines.append(l)
        if len(lines): break
        tries -= 1
        time.sleep(1)
    return lines
Snad Vam to k necemu bude prospesne...
S pozdravem
MP
-- 
gtalk/jabber:slush na jabber.cz <jabber%3Aslush na jabber.cz>
email/msn:marek na palatinus.cz <msn%3Amarek na palatinus.cz>
icq:360-737-802
tel:+420 724 249 422
------------- dal¹í èást ---------------
HTML p?íloha byla odstran?na...
URL: http://www.py.cz/pipermail/python/attachments/20080421/502a2005/attachment.htm 
    
    
Další informace o konferenci Python