2012-04-02 30 views
0

我只有一個字典格式如一個lib/languages.py文件:的Unicode與Jinja2的在谷歌應用程序引擎

en = {} 
en["farewell"] = "goddbye" 
es = {} 
es["farewell"] = "Adiós" 

另外我有一個lib/basehandler.py,我使用language.py這basehandler有一個Unicode文本(# - - 編碼:UTF-8 - -

的問題是,當我呈現在西班牙語(ES)的模板,在HTML有 「阿迪& ocuate; S」代替「Adi&oaucte; s」

我試圖在languages.py

使用
es["farewell"] = "Adiós" 

或添加的Unicode文本(# - - 編碼:UTF-8 - -),但沒有工作。

任何人都可以請告訴我,我做錯了或什麼的就Jinja2的

這裏使用Unicode工作最好的辦法是源代碼https://github.com/coto/gae-boilerplate,如果你想看到的問題http://appengine.protoboard.cl/?&hl=es

在此先感謝

+1

'「ó」'不是一個unicode文字,它是一個完全用ASCII字符表示的HTML實體。 python解釋器不需要被告知源編碼來處理它。 – geoffspear 2012-04-02 14:22:26

回答

2

您正在使用jinja2的庫已將autoescape默認設置爲True。您可以將basehandler.py在你的代碼重寫此,尋找這些行:

@webapp2.cached_property 
def jinja2(self): 
    return jinja2.get_jinja2(app=self.app) 

這種替換:

@webapp2.cached_property 
def jinja2(self): 
    return jinja2.get_jinja2(app=self.app,{'environment_args':{'autoescape':False}}) 

我不知道,如果在附加代碼environment_argsautoescape以上需要單引號。隨意嘗試不同的變化。

如果您想保留autoescape True作爲默認值,那麼您可以將|safe添加到模板中的每個變量中。

例如在home.html

{{ lang.text_title }} 

成爲

{{ lang.text_title|safe }} 

等等...

+0

感謝,現在的[樣板](http://appengine.protoboard.cl)甚至支持中文:D – coto 2012-04-02 07:31:19

+0

酷!只是好奇。以上哪種方法最終使用?將autoescape默認設置爲False或將| safe添加到模板中? – Albert 2012-04-02 07:33:51

+1

我會**強烈勸阻**觸摸'autoescape':無論在何處打印用戶輸入而不轉義,都有HTML注入漏洞,可能導致跨站腳本。 – bobince 2012-04-02 15:51:37

3
es["farewell"] = "Adiós" 

你不應該需要使用HTML標記來獲得非ASCII字符。使用Python的Unicode字符串字面:

es["farewell"] = u"Adi\u00F3s" 

或者,如果你有你的coding指令和文本編輯器的編碼一字排開正確,只是:

es["farewell"] = u"Adiós" 

的問題,包括HTML中的字符串是那麼您必須輸出它,而不使用HTML轉義,此時字符串中的任何<&字符都會中斷,並且如果有任何用戶輸入添加到字符串中,則存在安全問題。最好保持原始非轉義形式的字符串,直到它們達到輸出。

+0

@coto這是更好的答案。 :) – Albert 2012-04-03 08:02:26