在Google App Engine上使用Jinja2的Unicode

时间:2012-04-02 05:35:57

标签: python google-app-engine unicode jinja2

我有一个只有dict格式的lib / languages.py文件,例如:

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

我还有一个lib / basehandler.py,我使用language.py,这个basehandler有一个Unicode文字(# - - 编码:utf-8 - -

问题在于,当我用西班牙语渲染模板时,html有“Adi& 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

提前致谢

2 个答案:

答案 0 :(得分:3)

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

您不需要使用HTML标记来获取非ASCII字符。使用Python Unicode字符串文字:

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

或者,如果您的coding指令和文本编辑器编码排列正确,只需:

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

在字符串中包含HTML的问题是,您必须在没有HTML转义的情况下输出它,此时字符串中的任何<&字符都会中断,如果有任何用户输入添加到字符串中你遇到了安全问题。最好保持原始非转义形式的字符串,直到它们达到输出的那一刻。

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

依旧......