我正在构建一个金字塔/ 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标签内。这是真的吗?
答案 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:<" />script>
var data = <tal:script replace="structure jsdata" />;
<tal:lt replace="string:<" />/script>
会隐藏Chameleon的script
标签。
尝试尽可能减少页面中生成的JavaScript数量是一种很好的做法。