访问在Mako命名空间中定义的变量

2 投票
2 回答
4005 浏览
提问于 2025-04-16 21:32

通常,在Mako中“导入”一个命名空间似乎只允许访问定义的内容。

## base.mako
<%
  somevar = ["one", "two", "three"]
%>

<%def name="foo()">Bar</%def>

还有一个导入的模板:

## child.mako
<%namespace name="base" file="base.mako" />

${base.foo()} # works
${base.somevar} # fails: no soup for you

在我的使用场景中,somevarfoo是有关系的。我希望能方便地在导入的模板中也访问到somevar。这样做的最佳方法是什么呢?

2 个回答

2

正如用户9000上面提到的,我找到了一个解决办法。我把这个方法发出来,以便记录下来,万一其他人需要用到。不过我还是希望有更专业的人能提供更好的方法。

据我所知,你不能通过命名空间访问在模块块中定义的函数,但你可以访问一个<%def>。默认情况下,<%def>块会直接输出到上下文缓冲区,所以你需要做一些变通:

## base.mako
<%!
  somevar = ["one", "two", "three"]
%>

<%def name="getSomeVar()">
  <%
    return somevar
  %>
</%def>

然后在另一个模板中,将base.mako的命名空间导入为base,并通过${base.getSomeVar()}来获取somevar的值。

4

我也遇到过同样的问题,答案在关于继承的文档里:

Namespace对象的attr访问器可以让你访问在模板中声明的模块级变量。通过访问self.attr,你可以从继承链中访问在<%! %>部分声明的常规属性。

所以我觉得你需要用base.attr.somevar

撰写回答