[Web-SIG] Emulating req.write() in WSGI

Aaron Fransen aaron.fransen at gmail.com
Wed Jun 30 13:35:49 CEST 2010


On Tue, Jun 29, 2010 at 6:17 PM, Graham Dumpleton <
graham.dumpleton at gmail.com> wrote:

> On 30 June 2010 02:14, Aaron Fransen <aaron.fransen at gmail.com> wrote:
> > Couple more things I've been able to discern.
> >
> > The first happened after I "fixed" the html code. Originally under
> > mod_python, I guess I was cheating more than a little bit by sending
> > <html></html> code blocks twice, once for the incremental notices, once
> for
> > the final content. Once I changed the code to send a single properly
> parsed
> > block, the entire document showed up as expected, however it still did
> not
> > send any part of the html incrementally.
> >
> > Watching the line with Wireshark, all of the data was transmitted at the
> > same time, so nothing was sent to the browser incrementally.
> >
> > (This is using the write() functionality, I haven't tried watching the
> line
> > with yield yet.)
>
> Use a variation of WSGI middleware wrapper in:
>
>
> http://code.google.com/p/modwsgi/wiki/DebuggingTechniques#Tracking_Request_and_Response
>
> using it to 'print' returned data to Apache log and then tail Apache
> error log to see when that data is output. Alternatively, change the
> code there to output a time stamp against each chunk of data written
> to the file recording the response content.
>
> This will show what data is returned by WSGI application, before
> mod_wsgi truncates anything greater than content length specified,
> plus also show whether it is your WSGI application which is delaying
> output somehow, or whether Apache output filters are doing it.
>
> Graham
>

I've actually tried a variation on this already using a built-in logging
facility in the application that writes date/time values to an external log
file with comments, and in the case of testing wsgi I actually included some
time.sleep() statements to force a delay in the application.

To give you an idea of the flow, here's essentially what's going on:

def application(environ,start_response):
    mydict = {}
    mydict['environ']=environ
    mydict['startresponse'] = start_response
    # run program in another .py file that has been imported
    RunTest(mydict)

Then in the other module you would have something like:

def RunTest(mydict):
    status = '200 OK'
    response_headers = [('Content-type','text/html')]
    writeobj = detail['startresponse'](status,response_headers)
    writeobj('<html><body>Fetching sales for 2009...')
    time.sleep(2)
    writeobj('<br>Fetching sales for 2010...')

    ...then finally...

    writeobj('5000 results returned.</body></html>')
    return

This is obviously a truncated (and fake) example, but it gives you an idea
of the flow.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/web-sig/attachments/20100630/9f5a1f85/attachment.html>


More information about the Web-SIG mailing list