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. Thanks in advance.
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()), original_finish()) self.renderTheActualPage() 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. dp
Will that include the HTTP response code and headers? On Thu, 4 Nov 2004 13:02:14 -0800, Donovan Preston <dp@ulaluma.com> wrote:
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()), original_finish()) self.renderTheActualPage() 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.
dp
participants (2)
-
Donovan Preston
-
Peter Hunt