![](/img/trans.png)
[英]How to correctly include javascript code in chameleon/zpt template (pyramid)?
[英]How can I insert JSON into a script tage in a zope chameleon template?
我正在構建一個pyramid / 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/zh-CN/latest/narr/templates.html看來,Genshi樣式替換是要走的路,我認為這是我上面提到的內容是正確的。 但是,我仍然不確定是否應該區別對待,因為它在javascript標記內。 這是真的?
您要插入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>
我不確定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>
這將隱藏變色龍的script
標簽。
嘗試使頁面中生成的JavaScript數量盡可能少是一個好習慣。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.