我正在使用带有Mako的cherrypy作为模板引擎。
我希望Mako根据所请求的应用程序查找不同的目录。
即。 我有三个'应用':网站,管理员和安装。
他们都有自己的模板文件夹,结构类似于:
/ system包含一些系统范围的模板,如404页面等。
我正在使用Twiseless作为参考,同时试图掌握cherrypy / mako,但我仍然坚持如何做到这一点。
继续阅读以了解我是如何尝试这样做的简要概述,但是警告:我认为我的方式完全是错误的! :)所以,如果你有任何想法/指针,最好省去阅读比这更进一步的麻烦。
在我的主文件server.py中,我执行以下操作:
from libs.plugins.template import MakoTemplatePlugin
engine = cherrypy.engine
makoTemplate = MakoTemplatePlugin(engine, self.base_dir)
setTemplateDirs(makoTemplate, self.template_path)
MakoTemplatePlugin是该插件的略微修改版本,与Twiseless中的相同名称相关联,上面链接。
此代码的作用是将TemplateLookup设置为使用我的全局配置文件中的默认模板目录。即。
然后,每次加载应用程序时,我都会调用一个函数(setTemplateDirs)来更新Mako搜索的目录。
我认为这会奏效,但事实并非如此。最初我犯了为每个应用程序创建一个新的MakoTemplatePlugin实例的错误。这只会导致在每个页面加载时调用 all ,从第一个实例化开始,只包含基本的非应用程序特定目录。
首先调用它,它触发了404错误,因为它在错误的文件夹中搜索。
我确保将MakeTemplatePlugin的引用传递给我的所有应用程序。我想如果每次调用每个应用程序时都运行setTemplateDirs
,这将解决问题......但事实并非如此。
我不知道将函数放在何处,因此每次请求页面时它都会运行...
e.g。
# /apps/site/app.py
import somemodule.setTemplateDirs
class Site(object, params):
def __init__(self):
self.params = params
self.makoTemplate = params['makoTemplate']
self.base_path = params['base_path']
setTemplateDirs(self.makoTemplate, self.base_path, '', '/')
@cherrypy.expose
@cherrypy.tools.render(template='index.html')
def index(self):
pass
这显然只适用于首次加载应用程序时...我尝试将更新函数调用移动到单独的方法update
并尝试为每个页面调用它,例如:
@cherrypy.exposed
@cherrypy.tools.render(template='index.html')
@update
def index(self):
pass
但这只是给我配置相关的错误。
而不是继续搞乱这个,必须是一种更简单的方法。
你会怎么做?
非常感谢,
汤姆
答案 0 :(得分:0)
我得到了这个工作。感谢stephan提供mako工具示例的链接:http://tools.cherrypy.org/wiki/Mako。
我只是略微修改它以使其正常工作。
如果有人想知道,它的基础是你在全局配置中定义tools.mako.directories
,那么你可以在单个app配置文件中覆盖它。
e.g。
<强> server.conf中强>
...
tools.mako.directories: ['', 'system']
...
<强> site.conf 强>
...
tools.mako.directories: ['site', 'system']
...
我做了一些额外的工作来将相对URI转换为绝对路径,但上面解释了它的关键。