]> git.ipfire.org Git - thirdparty/tornado.git/commitdiff
Fix template rendering for non-string expressions.
authorBen Darnell <ben@bendarnell.com>
Mon, 30 May 2011 19:11:42 +0000 (12:11 -0700)
committerBen Darnell <ben@bendarnell.com>
Mon, 30 May 2011 19:11:42 +0000 (12:11 -0700)
Template.generate() now always returns byte strings.

tornado/template.py
tornado/test/template_test.py

index 465d210dc0730e119a198c231bb3986428d57db5..d3b3861261e92515bfff37501934462985126b5a 100644 (file)
@@ -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):
index d6ebc71ad430bd54006044e0653bfa767257f873..120c73ba018255536a331cf25189dfd3de643248 100644 (file)
@@ -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(),
-                         "<title>page title</title>\n<body>page body</body>\n")
+                         b("<title>page title</title>\n<body>page body</body>\n"))