From: Ben Darnell Date: Mon, 30 May 2011 19:11:42 +0000 (-0700) Subject: Fix template rendering for non-string expressions. X-Git-Tag: v2.0.0~40 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=25494d18f22b8c0128888ade59930dbc6d59cd88;p=thirdparty%2Ftornado.git Fix template rendering for non-string expressions. Template.generate() now always returns byte strings. --- diff --git a/tornado/template.py b/tornado/template.py index 465d210dc..d3b386126 100644 --- a/tornado/template.py +++ b/tornado/template.py @@ -88,6 +88,7 @@ import os.path import re from tornado import escape +from tornado.util import bytes_type class Template(object): """A compiled template. @@ -121,6 +122,8 @@ class Template(object): "squeeze": escape.squeeze, "linkify": escape.linkify, "datetime": datetime, + "_utf8": escape.utf8, # for internal use + "_string_types": (unicode, bytes_type), } namespace.update(kwargs) exec self.compiled in namespace @@ -232,7 +235,7 @@ class _File(_Node): with writer.indent(): writer.write_line("_buffer = []") self.body.generate(writer) - writer.write_line("return ''.join(_buffer)") + writer.write_line("return _utf8('').join(_buffer)") def each_child(self): return (self.body,) @@ -304,7 +307,7 @@ class _ApplyBlock(_Node): with writer.indent(): writer.write_line("_buffer = []") self.body.generate(writer) - writer.write_line("return ''.join(_buffer)") + writer.write_line("return _utf8('').join(_buffer)") writer.write_line("_buffer.append(%s(%s()))" % ( self.method, method_name)) @@ -345,10 +348,9 @@ class _Expression(_Node): def generate(self, writer): writer.write_line("_tmp = %s" % self.expression) - writer.write_line("if isinstance(_tmp, str): _buffer.append(_tmp)") - writer.write_line("elif isinstance(_tmp, unicode): " - "_buffer.append(_tmp.encode('utf-8'))") - writer.write_line("else: _buffer.append(str(_tmp))") + writer.write_line("if isinstance(_tmp, _string_types):" + " _buffer.append(_utf8(_tmp))") + writer.write_line("else: _buffer.append(_utf8(str(_tmp)))") class _Text(_Node): @@ -366,7 +368,7 @@ class _Text(_Node): value = re.sub(r"(\s*\n\s*)", "\n", value) if value: - writer.write_line('_buffer.append(%r)' % value) + writer.write_line('_buffer.append(%r)' % escape.utf8(value)) class ParseError(Exception): diff --git a/tornado/test/template_test.py b/tornado/test/template_test.py index d6ebc71ad..120c73ba0 100644 --- a/tornado/test/template_test.py +++ b/tornado/test/template_test.py @@ -1,11 +1,22 @@ +from tornado.escape import utf8 from tornado.template import Template, DictLoader from tornado.testing import LogTrapTestCase +from tornado.util import b class TemplateTest(LogTrapTestCase): def test_simple(self): template = Template("Hello {{ name }}!") self.assertEqual(template.generate(name="Ben"), - "Hello Ben!") + b("Hello Ben!")) + + def test_bytes(self): + template = Template("Hello {{ name }}!") + self.assertEqual(template.generate(name=utf8("Ben")), + b("Hello Ben!")) + + def test_expressions(self): + template = Template("2 + 2 = {{ 2 + 2 }}") + self.assertEqual(template.generate(), b("2 + 2 = 4")) def test_include(self): loader = DictLoader({ @@ -13,7 +24,7 @@ class TemplateTest(LogTrapTestCase): "header.html": "header text", }) self.assertEqual(loader.load("index.html").generate(), - "header text\nbody text") + b("header text\nbody text")) def test_extends(self): loader = DictLoader({ @@ -28,4 +39,4 @@ class TemplateTest(LogTrapTestCase): """, }) self.assertEqual(loader.load("page.html").generate(), - "page title\npage body\n") + b("page title\npage body\n"))