【发布时间】: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