如何将嵌套字典返回到Pyramid中的Mako模板?

2 投票
1 回答
3496 浏览
提问于 2025-04-17 09:17

当我尝试把一个嵌套字典返回给Mako模板时,它把单引号替换成了HTML代码 '(我在浏览器的源代码中看到了这个)。

在视图中:

@view_config(route_name='main', renderer='myproj:templates/main.mako')
def main_view(request):
    info = {'name': 'Some', 'age': 20}
    return {'info': info, 'country': 'Ukraine'}

在Mako中:

<script type="text/javascript">func(${info})</script>

在浏览器的源代码中:

<script type="text/javascript">func({&#39;name&#39;: &#39;Some&#39;, &#39;age&#39;: 20})</script>

怎么才能避免这种转义呢?(renderer='json' 不是一个选项,因为我需要在Mako中使用这个字典)

1 个回答

8

Mako 默认会对字符串进行转义,也就是说它会把一些特殊字符处理成安全的形式。如果你想关闭这种过滤,可以使用 |n。具体来说,就是 ${info|n}

不过在你的例子中,你是想把一个 python 字典传给一个 javascript 函数。这显然不太对劲,因为你需要把 python 的字典转换成 javascript 能用的东西。实际上,你想做的是把 python 字典变成一个字符串,然后直接输出到你的 javascript 代码中,而不进行任何过滤。

虽然可以把这个过程弄得更好看,但基本思路是这样的:在 python 中你可以这样做:

@view_config(route_name='main', renderer='myproj:templates/main.mako')
def main_view(request):
    info = json.dumps({'name': 'Some', 'age': 20})
    return {'info': info, 'country': 'Ukraine'}

而在 mako 中你可以这样做:

<script type="text/javascript">func(${info|n})</script>

默认情况下,Pyramid 会让 mako 使用 h 过滤器,这会对所有内容进行转义(这就是你遇到的问题)。你可以修改默认的过滤器,但通常这样做不是个好主意,因为可能会对其他代码产生副作用。另一种方法是依赖字典的 __str__ 实现来生成有效的 javascript 代码。在这种情况下,你只需运行 ${info|str,n},这样(至少在这个例子中)就能得到你想要的结果。

撰写回答