Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

[python] cherrypy + ajax

0 views
Skip to first unread message

"Ing. Vladislav Ludík"

unread,
Apr 20, 2008, 6:56:39 PM4/20/08
to Konference PyCZ
Zdravím všechny :-) ,

metodu Ajax jsem nasadil na Cherrypy server a neuspěl jsem příliš.

V podstatě jde jen o to, dostat okamžitě po změně dat na serveru
(běžícím pod Cherrypy, což asi není podstatné)
změněná data na klientskou stránku.

Můj dotaz:

Jaký kód přidat do generované stránky, aby si tato neustále (bez refreše
a jiného zásahu) vyžadovala obnovu dat.
Na straně serveru pak mám brzdu, která hlídá každou změnu dat. Není-li
změna, nic neodešle.
Je-li změna, uvolní brzdu a data odešle.

Dík za pomoc

vlada.vcf

azurIt

unread,
Apr 20, 2008, 7:19:45 PM4/20/08
to pyt...@py.cz
nejaky JavaScriptovy timer


>-----Pôvodná správa-----
>Od: "Ing. Vladislav Ludík" [mailto:vl...@ludik.cz]
>Komu: Konference PyCZ <pyt...@py.cz>
>Predmet: [python] cherrypy + ajax

Jaroslav Lukesh

unread,
Apr 21, 2008, 2:48:19 AM4/21/08
to Konference PyCZ
Ajax není PUSH, ale PULL

Musíte tedy kontrolovat (vyzvedávat segment) v pravidelných intervalech,
třeba 1s

Marek Palatinus

unread,
Apr 21, 2008, 4:28:29 AM4/21/08
to Konference PyCZ


2008/4/21 Jaroslav Lukesh <luk...@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:sl...@jabber.cz
email/msn:ma...@palatinus.cz
icq:360-737-802
tel:+420 724 249 422

Vlada Macek

unread,
Apr 21, 2008, 1:20:06 PM4/21/08
to Konference PyCZ
Ing. Vladislav Ludík wrote:
> Zdravím všechny :-) ,
> metodu Ajax jsem nasadil na Cherrypy server a neuspěl jsem příliš.
> V podstatě jde jen o to, dostat okamžitě po změně dat na serveru
> (běžícím pod Cherrypy, což asi není podstatné)
> změněná data na klientskou stránku.
Chcete-li změny vidět skutečně v rámci mžiknutí oka, vyberte si jinou
implementaci klient-server, než je webový prohlížeč a server. Snížíte-li
periody požadavků na desítky milisekund, zatížíte jak klienta, tak server.

Web prostě na to není dělaný, potřebujete zřejmě nativního klienta s
vlastním protokolem typu PUSH.

--
\//\/\


tuttle.vcf

Jaroslav Lukesh

unread,
Apr 21, 2008, 1:40:03 PM4/21/08
to Konference PyCZ

----- Original Message -----
From: "Vlada Macek" <tut...@sandbox.cz>

> Web prostě na to není dělaný, potřebujete zřejmě nativního klienta s
> vlastním protokolem typu PUSH.

Taky by se na to dal použít WAP, ale už netuším jak je to s PUSH podporou
pokud neprovozuje vlastní WAP server u operátora ale jen http s wapovými
stránkami u sebe.

Lukoko

unread,
Apr 21, 2008, 5:13:44 PM4/21/08
to

To nebude asi to správné řešení. Jednak by byla potřeba vlastni sms
gateway (postačí GSM modem připojený k pc), nebo se připojit na
nějakého agregátora SMS služeb. Ale to asi taky nebylo to pravé
ořechové, protože u O2 trvá třeba 10 minut, než doručí přes
partnerskou sms gateway.
Doporučuji použít řešení s javascriptem a setInterval. Rozhodně bych
ale volil delší timeouty ... ten příklad se čtením logu počítá spíš s
jednouživatelským webem, než s masovou záležitostí.
Jinak cherryPy fandim ... moc příjemně se pod ním píše.

0 new messages