2010-08-01 15 views
3

我正在使用Mako模板在Pylons下進行開發。問題是我需要將一個字符串從tmpl_context的某個屬性分配給頁面主體中的JavaScript變量。額外的問題是,這個字符串可以是很隨意的,即可以包含諸如「,',<,>等等這樣的字符...有沒有一種常見的方式來做這樣的任務? 我試過類似:如何從主塔控制器獲得一些字符串值被分配給Mako的JavaScript變量?

<script> 
    ... 
    var a = "${c.my_string}"; 
    ... 
</script> 

,但我得到引號和HTML特殊字符轉義,但我不希望禁用的,因爲意外的代碼執行可能存在的危險過濾

回答

2

你有c.my_string一些任意的數據,因此不想用 「| N」,對不對?

Quickiest方式來逃避它在JS風格的轉義是

var a = ${c.my_string.__repr__()|n}; # Note lack of "" around it! 

但是我不確定<>字符(像</script>插入),也許你也想用.replace('<', '&lt;');

對於unicode,您需要從字符串的起始處去掉「u」字符。

+0

對,這似乎正是我需要的。我認爲問題最好用.replace('<','\ u003c')來解決,因爲.replace('<','<')會更改源字符串。 – eigenein 2010-08-01 15:54:43

1

如果我明白你想要什麼,嘗試webhelpers.html.literal

幫手:

from webhelpers.html import literal 

HTML:

<script> 
    document.write('${h.literal(c.my_string)}'); 
</script> 

這比${c.mystring|n}更好逃逸HTML

+0

不是那樣。目標是將c.my_string的值分配給JS變量不變。例如,如果c.my_string是foo <> _「'」「bar,那麼我需要一些變量'a'來精確地包含foo <> _」'「」欄。 – eigenein 2010-08-01 15:34:10

+2

AFAIK literal()不會轉義引號,也不會過濾html。所以它與| n相同 - 它告訴escape()它的內容已經被轉義了。 – 2010-08-01 15:34:55

相關問題