0

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

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

与其继续纠结这个,不如有一个更简单方法。

你会怎么做?

非常感谢,

汤姆

4

1 回答 1

0

我得到了这个工作。感谢 stephan 提供 mako 工具示例的链接:http ://tools.cherrypy.org/wiki/Mako 。

我只是稍微修改了一下以使其正常工作。

如果有人想知道,它的基础是您tools.mako.directories在全局配置中定义,然后您可以在单个应用程序配置文件中覆盖它。

例如

服务器配置文件

...
tools.mako.directories: ['', 'system']
...

站点配置文件

...
tools.mako.directories: ['site', 'system']
...

我做了一些额外的工作来将相对 URI 转换为绝对路径,但它的关键在上面已经解释过了。

于 2013-02-02T12:22:57.657 回答