[Twisted-web] Buffered requests

Donovan Preston dp at ulaluma.com
Thu Nov 4 14:02:14 MST 2004

On Nov 4, 2004, at 10:35 AM, Peter Hunt wrote:

> I'm wondering if there is a way that I can "buffer" a request, store
> the output it would normally send to the client in a string, and then
> output something different, such as a redirect, to the client.
> For example, it'd be nice if it worked like this:
> buffered_request.setHeader("Content-type","text/html")
> buffered_request.write("<html>Hello %s</html>" %
> buffered_request.args.get("name",["world"])[0])
> buffered_request.finish()
> output = buffered_request.getOutput()
> request.setHeader("Content-type","text/plain")
> request.write("The output that will be written to the client is:\n " + 
> output)
> The end result (in the browser) should be:
> The output that will be written to the client is:
> 200 OK
> Content-type: text/plain
> <html>Hello world</html>
> I've tried playing around with something called "queued", but I'm not
> sure if that's what I want. Essentially I just want to capture the
> output of a request in a string.

You'll have to do it yourself. You could just do it explicitly by 
constructing an object around the request and doing the buffering in 
that. Or you could try being really tricky and doing something like 
this (untested):

class Foo(Resource):
     def render_GET(self, request):
         buffer = StringIO()
         original_write = request.write
         request.write = buffer.write
         original_finish = request.finish
         request.finish = lambda: (original_write(buffer.getvalue()), 
         return NOT_DONE_YET

nevow's rend.Page has a "buffered" attribute which, when set, does all 
this for you, so you can set headers any time during the rendering 
process and the headers will not be written until the entire body has 
been rendered.


More information about the Twisted-web mailing list