Mako 模板:如何找到当前模板包含的模板名称?

4 投票
1 回答
801 浏览
提问于 2025-04-16 02:09

我有多个模板,它们之间会互相包含,比如:

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'。你可以根据自己的需要进行调整。

撰写回答