[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