2

我正在构建一个金字塔/python 应用程序,其中可调用某个模板的视图传入一个名为 data 的值。这个变量是一个数组,形式为[[[x1,y1,z1,],...],[[v1,v2,v3],...]]

在我的可视化中我有

import json

jsdata = json.dumps(data)

我想将其放入模板的 javascript 脚本标记部分,以便:

<script>
data=${jsdata}
</script>

但我很确定语法不正确。我怎样才能做到这一点?

编辑:从这里:http : //docs.pylonsproject.org/projects/pyramid/en/latest/narr/templates.html 似乎Genshi风格的替代品是要走的路,我认为这意味着我上面有是正确的。但是,我仍然不确定是否应该区别对待,因为它位于 javascript 标记中。这是真的?

4

2 回答 2

3

您想插入一个JavaScript数组,而不是 Python 列表。

在 Python 和 JavaScript 格式之间进行转换的最简单方法是使用该json模块。JSON 毕竟是数据的 JavaScript 子集:

import json

jsdata = (json.dumps(data)
            .replace(u'<', u'\\u003c')
            .replace(u'>', u'\\u003e')
            .replace(u'&', u'\\u0026')
            .replace(u"'", u'\\u0027'))

然后传递jsdata给您的模板。这些str.replace()调用确保数据保持 HTML 安全。

在模板中,插入这个而不转义:

<script>
var data = ${structure:jsdata};
</script>
于 2013-02-11T18:51:48.233 回答
1

我不确定 Chameleon,但“经典”Zope 页面模板不允许在script标签内做任何事情——如果你没有看到你的变量被插值,那么 Chameleon 的行为很可能是一样的。据我了解,这样做的原因是为了避免这种类型的代码生成(您是通过模板从 Python 生成 JavaScript)。此外,ZPT 是一种基于 XML 的模板语言,<script>标签的内容不必是有效的 XML。

要解决此问题,您可以执行以下操作

jsdata = '<script type="text/javascript">var data = ' + json.dumps(data) + ';</script>'

并在您的模板中插入整个内容:

<tal:myscript replace="structure jsdata" />

或者,你可以做类似的事情

<tal:lt replace="string:&lt;" />script>
   var data = <tal:script replace="structure jsdata" />;
<tal:lt replace="string:&lt;" />/script>

这将隐藏script变色龙的标签。

尽量减少页面中生成的 JavaScript 数量是一个好习惯。

于 2013-02-12T00:51:24.670 回答