[mod_python] feature request: psp templating returns html codeto calling script, not to browser.

Wouter van Marle wouter at squirrel-systems.com
Thu May 19 03:41:58 EDT 2005


And a little bit of fiddling later I come to this result: psp2html;
direct. I don't see the need of capturing the in-between Python code
anyway. As such it runs and appears pretty robust, without scary handler
hacks that I don't really understand.
Thanks Graham for the further input and advice.

from mod_python import _psp
import os
import sys
import StringIO

def psp2html (filename, vars={}):
    dir, fname = os.path.split(filename)
    dir += "/"
    # produce usable python code using the psp parser.
    pycode = _psp.parse(fname, dir).splitlines()
    pycode = [s.rstrip() for s in pycode]
    code = ""
    # as req.write() for a real request object works a little different
    # than the req.write we use here, we have to change the code a
    # little bit.
    for s in pycode:
        code += s.replace(",0)", ")")+"\n"
    vars["req"] = StringIO.StringIO()
    try:
        exec code in vars
    except:
        et, ev, etb = sys.exc_info()
        raise et, ev, etb
    return vars["req"].getvalue()


Wouter.


On Thu, 2005-05-19 at 01:52 -0400, Graham Dumpleton wrote:
> Wouter van Marle wrote ..
> > def get_source(filename):
> >     dir, fname = os.path.split(filename)
> >     dir += "/"
> >     pycode = _psp.parse(fname, dir).splitlines()
> >     pycode = [s.rstrip() for s in pycode]
> >     for line in pycode:
> >         left = line.replace("\t", " "*4)
> >         result += left+"\n"
> >     return result
> 
> This may only work for an indenting style where tabs are used. At least
> the substitution of tabs with 4 spaces looks dangerous to me in that it
> could screen up indenting of code. You would also be changing tabs
> that may be present in literal strings. Why did you feel you needed to
> do these changes.
> 
> > def get_html(filename, vars={}):
> >     code = get_source(filename)
> >     lines = code.splitlines()
> >     code = 'html = ""\n'
> >     for l in lines:
> >         l = l.replace("req.write(", "html +=").replace(",0)", "")
> >         code += l+"\n"
> >     global_scope = globals().copy()
> >     global_scope.update(vars)
> >     html = ""
> >     l = locals()
> >     try:
> >         exec code in global_scope, l
> >     except:
> >         et, ev, etb = sys.exc_info()
> >         raise et, ev, etb
> >     return l["html"]
> 
> Actually modifying the source code seems a bit messy to me. You could
> still use the "req" wrapper class hack I suggested before, or if you know
> the PSP page never actually references the "req" object explicitly, you
> could pass an instance of StringIO into it and call it "req" and it should just
> work. This would avoid having to pass in locals(). For the purposes of
> what you are doing, there is probably no point even copying globals as
> it may not give you anything you need anyway. You could almost just
> use "exec code in vars".
> 
> def get_html(filename, vars={}):
>      code = get_source(filename)
>      vars = vars.copy()
>      vars["req"] = StringIO.StringIO()
>      try:
>          exec code in vars
>      except:
>          et, ev, etb = sys.exc_info()
>          raise et, ev, etb
>      return vars["req"].getvalue()
> 
> 
> Graham
> 
> 



More information about the Mod_python mailing list