|
Graham Dumpleton
grahamd at dscpl.com.au
Tue Oct 31 17:29:57 EST 2006
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.
Graham
|