[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