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

时间:2011-12-30 21:12:22

标签: python pyramid

当我尝试将嵌套字典返回到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 个答案:

答案 0 :(得分:6)

默认情况下,Mako配置为转义字符串。如果您要禁用过滤器,可以通过|n完成。具体来说是${info|n}

但是,在您的示例中,您尝试将 python 字典传递给 javascript 函数。这显然没有加起来,你需要将python dict变成javascript可用的东西。你真正想要做的是将你的python dict变成一个字符串,然后输出而不过滤你的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过滤器,它会逃避一切(你看到的问题)。您可以编辑默认过滤器,但由于其他代码中可能存在副作用,因此通常不是最好的主意。另一种可能性是依赖于dict的__str__实现来生成有效的javascript代码。在这种情况下,您不需要序列化任何内容,只需运行${info|str,n}(至少在这种情况下)会产生您想要的结果。