Python:每个应用程序的Mako模板查找

时间:2013-02-01 17:25:37

标签: python templates cherrypy mako

我正在使用带有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

但这只是给我配置相关的错误。

而不是继续搞乱这个,必须是一种更简单的方法。

你会怎么做?

非常感谢,

汤姆

1 个答案:

答案 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转换为绝对路径,但上面解释了它的关键。