templates: fix encoding handling in django templates (#20831)

This commit is contained in:
Frédéric Péters 2017-12-20 15:57:53 +01:00
parent 4c7c3902db
commit 0218258a15
2 changed files with 14 additions and 1 deletions

View File

@ -66,6 +66,11 @@ def test_template_encoding():
assert tmpl.render({'foo': 'fou'}) == 'fou à vélo'
assert tmpl.render({'foo': 'félé'}) == 'félé à vélo'
tmpl = Template("{% if foo == 'félé' %}à vélo{% endif %}")
assert tmpl.render() == ''
assert tmpl.render({'foo': 'fou'}) == ''
assert tmpl.render({'foo': 'félé'}) == 'à vélo'
# ezt
tmpl = Template('[foo] à vélo')
assert tmpl.render() == '[foo] à vélo'

View File

@ -449,6 +449,14 @@ def ezt_raises(exception, on_parse=False):
raise TemplateError(message % ' '.join(parts))
class UnicodeDjangoContext(DjangoContext):
def __getitem__(self, key):
s = super(UnicodeDjangoContext, self).__getitem__(key)
if isinstance(s, str):
return unicode(s, 'utf-8')
return s
class Template(object):
def __init__(self, value, raises=False, ezt_format=ezt.FORMAT_RAW, ezt_only=False):
'''Guess kind of template (Django or ezt), and parse it'''
@ -482,7 +490,7 @@ class Template(object):
return str(self.value)
def django_render(self, context={}):
context = DjangoContext(context)
context = UnicodeDjangoContext(context)
try:
rendered = self.template.render(context)
except (DjangoTemplateSyntaxError, DjangoVariableDoesNotExist) as e: