<br><br><div class="gmail_quote">2008/4/21 Jaroslav Lukesh &lt;<a href="mailto:lukesh@seznam.cz">lukesh@seznam.cz</a>&gt;:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Ajax není PUSH, ale PULL</blockquote><div><br>Jde to jednoduse nasimulovat:<br><br>V JS udelejte bezny setInterval s periodou cca 1s (klidne i mene), ve volane funkci vytvarejte request na serveru.<br>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.<br>
<br>Na zaver prikladam kus kodu (psano pomoci jQuery a Pythonu) pod licenci &quot;delejte si s tim co chcete&quot; :-) :<br><br>//funkce volana po 100ms v javascriptu, ziskava XML a parsuje do stranky<br>function checkLog() {<br>
&nbsp;&nbsp;&nbsp; user = $(&#39;#seluser&#39;).val()<br>&nbsp;&nbsp;&nbsp; log = $(&#39;#sellog&#39;).val()<br><br>&nbsp;&nbsp;&nbsp; if(!user || !log || working) return;<br><br>&nbsp;&nbsp;&nbsp; $(&#39;#status&#39;).text(&#39;reading...&#39;)<br>&nbsp;&nbsp;&nbsp; working = true<br>&nbsp;&nbsp;&nbsp; $.get(&#39;log.py/show?user=&#39;+user+&#39;&amp;log=&#39;+log+&#39;&amp;size=&#39;+size+&#39;&amp;filter=&#39;+$(&#39;#filter&#39;).val(), function(data) {<br>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; working = false<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $(&#39;#logarea&#39;).prepend($(&#39;data&#39;, data).text())<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if($(&#39;#logarea&#39;).text().length &gt; 1000000) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $(&#39;#logarea&#39;).text($(&#39;#logarea&#39;).text().substr(0,900000))<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; size = $(&#39;size&#39;, data).text()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $(&#39;#status&#39;).text(&#39;&#39;)<br>&nbsp;&nbsp;&nbsp; })<br>}<br><br># funkce v pythonu resici HTTP pooling, vraci data pokud jsou, jinak ceka par sekund<br>
def show(req, user, log, size, filter):<br>&nbsp;&nbsp;&nbsp; global logpath<br><br>&nbsp;&nbsp;&nbsp; if user == &#39;_master&#39;:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; logfile = &quot;%s/%s&quot;%(logpath, log)<br>&nbsp;&nbsp;&nbsp; else:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; logfile = &quot;%s/%s/%s&quot;%(logpath, user, log)<br>
<br>&nbsp;&nbsp;&nbsp; fp = open(logfile, &#39;r&#39;)<br><br>&nbsp;&nbsp;&nbsp; size = int(size)<br>&nbsp;&nbsp;&nbsp; if size == 0:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; size = os.path.getsize(logfile)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; size -= min(size, 3000)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fp.seek(size)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lines = _readlinesWait(fp, filter)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; del lines[0]<br>&nbsp;&nbsp;&nbsp; else:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fp.seek(size)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lines = _readlinesWait(fp, filter)<br><br>&nbsp;&nbsp;&nbsp; size = os.path.getsize(logfile)<br>&nbsp;&nbsp;&nbsp; fp.close()<br><br>&nbsp;&nbsp;&nbsp; ret = &#39;&#39;<br>&nbsp;&nbsp;&nbsp; for l in lines:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ret = &quot;%s%s&quot;%(l, ret)<br>
<br>&nbsp;&nbsp;&nbsp; return &quot;&lt;xml&gt;&lt;size&gt;%s&lt;/size&gt;&lt;data&gt;%s&lt;/data&gt;&lt;/xml&gt;&quot;%(size, ret)<br><br>def _readlinesWait(fp, filter):<br>&nbsp;&nbsp;&nbsp; tries = 5<br>&nbsp;&nbsp;&nbsp; while(tries):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tmp = fp.readlines()<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lines = []<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for l in tmp:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if filter != &#39;&#39; and l.find(filter) == -1:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; continue<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if l.find(&#39;log.py/&#39;) == -1:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lines.append(l)<br>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if len(lines): break<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tries -= 1<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; time.sleep(1)<br><br>&nbsp;&nbsp;&nbsp; return lines<br><br></div></div>Snad Vam to k necemu bude prospesne...<br><br>S pozdravem<br>MP<br>-- <br>gtalk/<a href="mailto:jabber%3Aslush@jabber.cz">jabber:slush@jabber.cz</a><br>
email/<a href="mailto:msn%3Amarek@palatinus.cz">msn:marek@palatinus.cz</a><br>icq:360-737-802<br>tel:+420 724 249 422