当我尝试将嵌套字典返回到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({'name': 'Some', 'age': 20})</script>
如何避免这种逃避? (renderer='json'
不是变体,因为我需要Mako中的字典)
答案 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}
(至少在这种情况下)会产生您想要的结果。