[mod_python] Capturing PSP output

Nicolas Lehuen nicolas.lehuen at gmail.com
Wed Jun 1 02:03:46 EDT 2005


Hi Graham,

The problem with this is that if the PSP needs to access some request
variables (like form variables), then it will fail. I think the best
way is still to decorate the request object with a fake write method,
something like this :

# this is pseudo code...
buffer = StringIO()
real_write = req.write
req.write = buffer.write
try:
    # do the PSP trick
finally:
    req.write = real_write

Another method could be to use a delegating request object, something like :

class FakeRequest(object):
    def __init__(self,req):
        self.req = req
        self.buffer = StringIO()

    def write(self,string,flush=1):
        self.buffer.write(string)

    def __getattr__(self,name):
        return getattr(self.req,name)

def index(req):
    fake_req = FakeRequest(req)
    # do the PSP trick using fake_req and additional variables
    req.write(fake_req.buffer.get_value())

Regards,
Nicolas

2005/6/1, Graham Dumpleton <grahamd at dscpl.com.au>:
> Only just got the chance to revisit this. Here is an alternate bit of
> code which avoids having to munge PSP code. This only works for
> where PSP code is stored in a file. It bypasses any caching mechanism
> present in the PSP class, but you could add your own if need be. It
> also replaces the request object entirely with a dummy object purely
> for the purposes of collecting output.
> 
> from mod_python import apache
> from mod_python import _psp
> 
> import os
> import StringIO
> 
> def _psp_to_str(filename,vars={}):
>   directory,file = os.path.split(filename)
> 
>   code = _psp.parse(file,directory+'/')
> 
>   class _MPStringIO(StringIO.StringIO):
>     def write(self,string,flush=1):
>       StringIO.StringIO.write(self,string)
> 
>   vars["req"] = _MPStringIO()
> 
>   exec code in vars
> 
>   return vars["req"].getvalue()
> 
> def handler(req):
>   directory = os.path.dirname(__file__)
>   filename = os.path.join(directory,"_sample.psp")
>   content = _psp_to_str(filename)
> 
>   req.content_type = "text/html"
>   req.send_http_header()
>   req.write(content)
> 
>   return apache.OK
> 
> 
> Graham Dumpleton wrote ..
> >
> > On 31/05/2005, at 2:19 AM, Joshua Ginsberg wrote:
> >
> > > Hello --
> > >
> > > I'm trying to do something a little unorthodox... I didn't know if
> > > anybody had tried it before... Within a PSP page, I want to run
> > > another PSP page and capture the output to a string.
> > >
> > > To do a little testing, I wrote the following PSP page:
> > >
> > > <%
> > >
> > > def sAppend(self, thestring):
> > >     if '__s__' not in dir(self):
> > >         self.__s__ = ''
> > >     self.__s__ += str(thestring)
> > >
> > > oldReqWrite = req.write
> > >
> > > req.write = sAppend
> >
> > This is a bit confusing. Your method accepts a "self" parameter as if
> > it is a
> > method of a class when it isn't. Just because you replace an existing
> > instance
> > method will not turn your one into one.
> >
> > The result is that the string to be output is being passed as self and
> > string
> > doesn't have a "__s__" member.
> >
> > There are other problems with using "__s__" as well but rather than go
> > into it,
> > you should just look at:
> >
> >    http://www.modpython.org/pipermail/mod_python/2005-May/018134.html
> >
> > That code could probably still be cleaned up a bit perhaps as certain
> > things
> > don't need to be done, also not sure why other things are being done
> > either.
> > If I get a chance later I'll see if I can come up with a more
> > streamlined
> > version.
> >
> > BTW, did you want to actually reference the original "req" object for
> > any
> > data. The example referenced obviously doesn't allow this as it
> > completely
> > replaces the "req" object with a StringIO object.
> >
> > Graham
> >
> > _______________________________________________
> > Mod_python mailing list
> > Mod_python at modpython.org
> > http://mailman.modpython.org/mailman/listinfo/mod_python
> _______________________________________________
> Mod_python mailing list
> Mod_python at modpython.org
> http://mailman.modpython.org/mailman/listinfo/mod_python
>



More information about the Mod_python mailing list