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

发布于 2024-12-23 16:06:34 字数 665 浏览 0 评论 0原文

当我尝试将嵌套字典返回到 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 中的字典)

When I tried to return a nested dictionary to Mako template, it replaces single quotes with HTML code ' (I saw it in browser's source code).

In views:

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

In Mako:

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

In browser's source code:

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

How to avoid this escaping? (renderer='json' is not variant, because I need that dictionary in Mako)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

被你宠の有点坏 2024-12-30 16:06:34

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} (至少在这种情况下)即可产生您想要的结果。

Mako is configured by default to escape strings. If you want to disable the filters this can be done via |n. Specifically ${info|n}.

In your example, however, you are trying to pass a python dictionary to a javascript function. This obviously doesn't add up and you need to turn the python dict into something usable by javascript. What you actually want to do here is turn your python dict into a string which is then output with no filtering to your javascript code.

This could be prettied up, but the idea is that in python you do:

@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'}

and in mako you do:

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

By default Pyramid sets mako to use the h filter, which escapes everything (the issue you're seeing). You can edit the default filters but it's not usually the greatest idea because of potential side-effects in other code. The other possibility is to rely on the dict's __str__ implementation to yield valid javascript code. In this case you do not need to serialize anything, simply run ${info|str,n} which (at least in this case) yields your desired result.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文