Юникод с Jinja2 в Google App Engine - PullRequest
       25

Юникод с Jinja2 в Google App Engine

0 голосов
/ 02 апреля 2012

У меня есть файл lib / languages.py только в формате dict, например:

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

Также у меня есть lib / basehandler.py, где я использую language.py, и этот базовый обработчик имеет литерал Unicode( # - - кодирование: utf-8 - - )

Проблема заключается в том, что при рендеринге шаблона на испанском (ых) языке HTML отображается «Adi & ocuate».; s "вместо" Adi & oaucte; s "

Я пытался использовать на languages.py

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

или добавить литерал Unicode ( # - - кодирование: utf-8 - - ), но ничего не получается.

Может кто-нибудь подсказать, пожалуйста, что я делаю не так или как лучше всего работать с Unicode на Jinja2

Вот исходный код https://github.com/coto/gae-boilerplate и если вы хотите увидеть проблему http://appengine.protoboard.cl/?&hl=es

Заранее спасибо

Ответы [ 2 ]

3 голосов
/ 02 апреля 2012
es["farewell"] = "Adiós"

Вам не нужно использовать разметку HTML, чтобы получить символы не ASCII.Используйте строковый литерал Unicode Python:

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

Или, если у вас правильно выстроены директива и кодировка текстового редактора coding, просто:

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

Проблема сВключение HTML в строки означает, что вы должны будете выводить его без экранирования HTML, после чего любые символы < или & в разрыве строки и, если есть какой-либо пользовательский ввод, добавленный в строку, вы получаете защитупроблема.Лучше хранить строки в необработанном необработанном виде до тех пор, пока они не достигнут результата.

2 голосов
/ 02 апреля 2012

В используемой вами библиотеке 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_args и autoescape в приведенном выше дополнительном коде нужны одинарные кавычки или нет.Не стесняйтесь пробовать их различные варианты.

Если вы хотите оставить значение autoescape True по умолчанию, вы можете просто добавить |safe к каждой переменной в вашем шаблоне.

Например,в home.html

{{ lang.text_title }}

становится

{{ lang.text_title|safe }}

и так далее ...

...