Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:Mako每个应用程序的模板查找_Python_Templates_Cherrypy_Mako - Fatal编程技术网

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

Python:Mako每个应用程序的模板查找,python,templates,cherrypy,mako,Python,Templates,Cherrypy,Mako,我使用cherrypy和Mako作为模板引擎 我希望Mako根据所请求的应用程序查找不同的目录 即。 我有三个“应用”:站点、管理和安装 它们都有自己的模板文件夹,结构类似: from libs.plugins.template import MakoTemplatePlugin engine = cherrypy.engine makoTemplate = MakoTemplatePlugin(engine, self.base_dir) setTemplateDirs(makoTempla

我使用cherrypy和Mako作为模板引擎

我希望Mako根据所请求的应用程序查找不同的目录

即。 我有三个“应用”:站点、管理和安装

它们都有自己的模板文件夹,结构类似:

from libs.plugins.template import MakoTemplatePlugin

engine = cherrypy.engine
makoTemplate = MakoTemplatePlugin(engine, self.base_dir)
setTemplateDirs(makoTemplate, self.template_path)
  • /模板
  • /模板/站点
  • /模板/管理员
  • /模板/安装
  • /模板/系统
/系统包含一些系统范围的模板,如404页等

当我试图抓住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设置为使用全局配置文件中的默认模板目录。i、 e

  • /模板
  • /模板/系统
然后,每次加载一个应用程序时,我调用一个函数(setTemplateDirs)来更新Mako搜索的目录

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

由于这是第一次调用,它触发了404错误,因为它在错误的文件夹中搜索

相反,我确保将对MakeTemplatePlugin的引用传递给我的所有应用程序。我想如果每次调用每个应用程序时都运行
setTemplateDirs
,这将解决问题。。。但事实并非如此

我不知道该把函数放在哪里,所以每次请求页面时它都会运行

e、 g

这显然只在应用程序首次加载时起作用。。。我尝试将更新函数调用移动到一个单独的方法
update
,并尝试为每个页面调用该方法,例如:

@cherrypy.exposed
@cherrypy.tools.render(template='index.html')
@update
def index(self):
    pass
但这只是给了我配置相关的错误

必须有一个更简单的方法,而不是继续在这件事上捣乱

你会怎么做

非常感谢


汤姆

我让这个工作起来了。感谢stephan提供mako工具示例的链接:

我只是稍微修改了一下,让它工作起来

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

e、 g

server.conf

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

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

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

我不确定我是否理解了这个问题。是什么阻止您使用受信任的设置
tools.mako.directories=“path/to/template”
,然后在模板映射器中执行例如
@cherrypy.tools.mako(filename=“/admin/adminpage.html”)
?[我可能完全不了解Twiseless,因为我不了解Twiseless]我已经研究了一些将mako与cherrypy集成在一起的不同实现,只是有点拘泥于Twiseless实现。那个链接看起来很有趣。。。我可以在类本身上使用类似于@cherrypy.tools.mako.directories(['/template/site'])的修饰符吗?然后在指定文件时,它将只使用这些目录…对吗?:)嗯,不确定
@cherrypy.tools.mako.directories(['/template/site'])
是否有效。我会首先尝试是否可以为每个应用程序设置
tools.mako.directories
(请参阅)。如果这不起作用(我不知道,只能在星期一检查),那么我会使用我上面建议的解决方案,即将模板目录设置为基础,并使用相对路径。