[mod_python] Building a web application using Cheetah andmod_python

Graham Dumpleton grahamd at dscpl.com.au
Tue Oct 31 17:51:53 EST 2006


Graham Dumpleton wrote ..
> Sebastian Celis wrote ..
> > 3) Cheetah and #include
> > 
> > I have read a lot about why mod_python sets the current working
> > directory to '/', but this seems to be causing some larger problems
> > when cheetah comes into play.  (3) and (4) discuss two issues that I
> > am having trouble with.
> > 
> > Here is /var/www/app/templates/testPage.tmpl:
> > ###
> > #include 'header_include.tmpl'
> > <head>
> > <title>$title</title>
> > </head>
> > <body>
> > <p>$message</p>
> > </body>
> > #include 'footer_include.tmpl'
> > ###
> > 
> > However, as this actually tries to load /header_include.tmpl and
> > /footer_include.tmpl instead of the ones located in my templates
> > directory, this will not work.  I came up with two workarounds,
> > however I don't really love either:
> 
> Use something like:
> 
>   from mod_python import apache
>   from Cheetah.Template import Template
> 
>   ### START NEW CODE
> 
>   class PathResolver:
>       def __init__(self, base):
>           self.__base = base
>       def __call__(self, path=None):
>           if path:
>              return os.path.join(self.__base, path)
>           return None
> 
>   ### FINISH NEW CODE
> 
>   def index(req):
>       req.content_type = "text/html"
>   
>       dict = {'title': 'My Title!', 'message': 'Hello world!'}
>       templateModule = apache.import_module("templates/myTemplate")
>       t = getattr(templateModule, "myTemplate")()
>       searchList = t.searchList()
>       searchList.insert(0, dict)
>   
>       ### START NEW CODE
> 
>       # Override Servlet.serverSidePath so that it returns path
>       # relative to the directory where we say module is located.
> 
>       t.serverSidePath = PathResolver(os.path.dirname(templateModule.__file__))
> 
>       ### FINISH NEW CODE
> 
>       return(t.respond())
> 
> This replaces the underlying method that is used calculate the actual
> path when you use #include. By doing it in the servlet, you don't have
> to do anything trick in the actual .tmpl file.

Or even simpler:

  def index(req):
      req.content_type = "text/html"
  
      dict = {'title': 'My Title!', 'message': 'Hello world!'}
      templateModule = apache.import_module("templates/myTemplate")
      t = getattr(templateModule, "myTemplate")()
      searchList = t.searchList()
      searchList.insert(0, dict)

      ### START NEW CODE
  
      t.serverSidePath = lambda x: os.path.join(os.path.dirname(templateModule.__file__), x)

      ### FINISH NEW CODE

      return(t.respond())

Graham


More information about the Mod_python mailing list