Mako 模板:如何找到当前模板包含的模板名称?
我有多个模板,它们之间会互相包含,比如:
t1.html :
...
<%include file="t2.html" args="docTitle='blablabla'" />
...
t2.html:
<%page args="docTitle='Undefined'"/>
<title>${docTitle}</title>
...
我想知道t2是否被t1包含(或者被其他模板包含,这样我可以用它的名字)。文档里没有找到特别合适的方法,我本可以再传一个参数(比如pagename='foobar'),但这样感觉像是变相的解决办法。
有没有什么简单的方法,可以通过一个简单的.render(blabla)调用来渲染这个页面呢?
1 个回答
1
根据我的了解,mako 并没有提供关于“父”模板的信息给被包含的模板。而且,它会小心地删除从上下文传递给被包含文件的任何相关信息。
所以我看到的唯一解决办法就是使用 CPython 的堆栈,找到最近的 mako 模板框架,并从中提取所需的信息。不过,这种方法可能会比较慢,也不太可靠,我建议还是明确地传递名称。这个方法还依赖于一些没有文档说明的 mako 特性,这些特性将来可能会发生变化。
下面是基于堆栈的解决方案:
在模板中:
${h.get_previous_template_name()} # h is pylons-style helpers module. Substitute it with cherrypy appropriate way.
在 helpers.py(或者其他适合 cherrypy 的地方):
import inspect
def get_previous_template_name():
stack = inspect.stack()
for frame_tuple in stack[2:]:
frame = frame_tuple[0]
if '_template_uri' in frame.f_globals:
return frame.f_globals['_template_uri']
这个方法会返回完整的 URI,比如 't1.html'。你可以根据自己的需要进行调整。