【问题标题】:Python: Mako template lookups per appPython:每个应用程序的 Mako 模板查找
【发布时间】:2013-01-17 02:04:27
【问题描述】:

我正在使用带有 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 设置为使用我的全局配置文件中的默认模板目录。即

  • /模板
  • /模板/系统

然后,每次加载应用时,我都会调用一个函数 (setTemplateDirs) 来更新 Mako 搜索的目录。

我认为这会起作用,但事实并非如此。最初,我犯了为每个应用程序创建一个新的 MakoTemplatePlugin 实例的错误。这只是导致它们all在每次页面加载时被调用,从实例化的第一个开始,仅包含基本的、非应用特定的目录。

在第一次调用时,它触发了 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

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

与其继续搞砸这个,必须有一个更简单的方法。

你会怎么做?

非常感谢,

汤姆

【问题讨论】:

  • 不确定我是否得到了这个问题。是什么阻止您使用受信任的tools.cherrypy.org/wiki/Mako,设置tools.mako.directories = "path/to/template",然后执行例如@cherrypy.tools.mako(filename="/admin/adminpage.html") 在模板映射器中? [我可能完全不了解 Twiseless]
  • 我查看了一些将 mako 与cherrypy 集成的不同实现,只是有点坚持使用 Twiseless 实现。该链接看起来很有趣......我可以在类本身上使用像:@cherrypy.tools.mako.directories(['/template/site']) 这样的装饰器吗?然后在指定文件时,它只会使用那些目录......对吗? :)
  • 嗯,不确定@cherrypy.tools.mako.directories(['/template/site']) 是否有效。我会先尝试是否可以为每个应用设置tools.mako.directories(请参阅docs.cherrypy.org/dev/concepts/config.html)。如果这不起作用(我不太清楚,只能在星期一检查),那么我将使用我上面建议的解决方案,即将您的模板目录设置为基础目录并使用那里的相对路径。

标签: python templates cherrypy mako


【解决方案1】:

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

我只是稍作修改以使其正常工作。

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

例如

server.conf

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

site.conf

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

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

【讨论】:

    猜你喜欢
    • 2016-11-03
    • 2013-03-08
    • 2015-01-06
    • 2021-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-16
    • 1970-01-01
    相关资源
    最近更新 更多