我正在使用带有 Mako 的cherrypy 作为模板引擎。
我希望 Mako 根据请求的应用程序查找不同的目录。
即我有三个“应用程序”:站点、管理和安装。
他们都有自己的模板文件夹,结构看起来像:
- /模板
- /模板/网站
- /模板/管理员
- /模板/安装
- /模板/系统
/system 包含一些系统范围的模板,如 404 页面等。
我在尝试掌握cherrypy / mako时使用Twiseless作为参考,但我不知道如何做到这一点。
请继续阅读我如何尝试执行此操作的简要概述,但请注意:我认为我的做法完全错误!:) 因此,如果您有任何想法/建议,最好省去阅读更多内容的麻烦。
在我的主文件 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 设置为使用我的全局配置文件中的默认模板目录。IE
- /模板
- /模板/系统
然后,每次加载应用程序时,我都会调用一个函数 (setTemplateDirs) 来更新 Mako 搜索的目录。
我认为这会奏效,但事实并非如此。最初,我犯了为每个应用程序创建一个新的 MakoTemplatePlugin 实例的错误。这只是导致它们在每次页面加载时都被调用,从第一个实例化开始,仅包含基本的、非应用程序特定的目录。
因为这是第一次调用,所以它触发了 404 错误,因为它在错误的文件夹中搜索。
相反,我确保将对 MakeTemplatePlugin 的引用传递给我的所有应用程序。我想如果我setTemplateDirs
每次调用每个应用程序时都运行,这将解决问题......但事实并非如此。
我不知道把函数放在哪里,所以每次请求页面时它都会运行......
例如
# /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
但这只会给我与配置相关的错误。
与其继续纠结这个,不如有一个更简单的方法。
你会怎么做?
非常感谢,
汤姆