Monday, March 28, 2011

Google Apps HTTP Streaming with Python question

I got a little question here:

Some time ago I implemented HTTP Streaming using PHP code, something similar to what is on this page:

http://my.opera.com/WebApplications/blog/show.dml/438711#comments

And I get data with very similar solution. Now I tried to use second code from this page (in Python), but no matter what I do, I receive responseText from python server after everything completes. Here are some python code:

print "Content-Type: application/x-www-form-urlencoded\n\n"

i=1
while i<4:
 print("Event: server-time<br>")
 print("data: %f<br>" % (time.time(),))
 sys.stdout.flush()
 i=i+1
 time.sleep(1)

And here is Javascript Code:

ask = new XMLHttpRequest();
ask.open("GET","/Chat",true);
setInterval(function()
{
if (ask.responseText) document.write(ask.responseText);
},200);
ask.send(null);

Anyone got idea what I do wrong ? How can I receive those damn messages one after another, not just all of them at the end of while loop? Thanks for any help here!

Edit:

Main thing I forgot to add: server is google app server (i'm not sure is that google own implementation), here is a link with some explanation (i think uhh):

http://code.google.com/intl/pl-PL/appengine/docs/python/gettingstarted/devenvironment.html http://code.google.com/intl/pl-PL/appengine/docs/whatisgoogleappengine.html

From stackoverflow
  • That looks like a cgi code - I imagine the web server buffers the response from the cgi handlers. So it's really a matter of picking the right tools and making the right configuration.

    I suggest using a wsgi server and take advantage of the streaming support wsgi has.

    Here's your sample code translated to a wsgi app:

    def app(environ, start_response):
        start_response('200 OK', [('Content-type','application/x-www-form-urlencoded')])
        i=1
        while i<4:
            yield "Event: server-time<br>"
            yield "data: %f<br>" % (time.time(),)
            i=i+1
            time.sleep(1)
    

    There are plenty of wsgi servers but here's an example with the reference one from python std lib:

    from wsgiref.simple_server import make_server
    
    httpd = make_server('', 8000, app)
    httpd.serve_forever()
    
    Wilq32 : I use google apps server implementation - do you know to handle this?
  • Its highly likely App Engine buffers output. A quick search found this: http://code.google.com/appengine/docs/python/tools/webapp/buildingtheresponse.html

    The out stream buffers all output in memory, then sends the final output when the handler exits. webapp does not support streaming data to the client.

    Wilq32 : that sux ;( ok then i try it diffrent way :)

0 comments:

Post a Comment