如何在zope变色龙模板中将JSON插入脚本标记?

时间:2013-02-11 18:48:24

标签: javascript json pyramid zope chameleon

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

形式的数组

在我的viewcallable中我有

import json

jsdata = json.dumps(data)

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

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

但我很确定语法不正确。我怎么能这样做?

编辑:从这个:http://docs.pylonsproject.org/projects/pyramid/en/latest/narr/templates.html似乎Genshi风格的替代品是要走的路,我认为这意味着我上面所说的是正确的。然而,我仍然不确定这是否应该被区别对待,因为它是在javascript标签内。这是真的吗?

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分: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>

会隐藏Chameleon的script标签。

尝试尽可能减少页面中生成的JavaScript数量是一种很好的做法。