diff --git a/CHANGES.rst b/CHANGES.rst index 21eb77651..9ec8a3a4a 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,5 +1,14 @@ .. currentmodule:: jinja2 +Version 2.11.1 +-------------- + +Unreleased + +- Fix a bug that prevented looking up a key after an attribute + (``{{ data.items[1:] }}``) in an async template. :issue:`1141` + + Version 2.11.0 -------------- diff --git a/src/jinja2/compiler.py b/src/jinja2/compiler.py index cbc0546d2..f450ec6e3 100644 --- a/src/jinja2/compiler.py +++ b/src/jinja2/compiler.py @@ -1641,14 +1641,14 @@ def visit_Operand(self, node, frame): @optimizeconst def visit_Getattr(self, node, frame): if self.environment.is_async: - self.write("await auto_await(") + self.write("(await auto_await(") self.write("environment.getattr(") self.visit(node.node, frame) self.write(", %r)" % node.attr) if self.environment.is_async: - self.write(")") + self.write("))") @optimizeconst def visit_Getitem(self, node, frame): @@ -1660,7 +1660,7 @@ def visit_Getitem(self, node, frame): self.write("]") else: if self.environment.is_async: - self.write("await auto_await(") + self.write("(await auto_await(") self.write("environment.getitem(") self.visit(node.node, frame) @@ -1669,7 +1669,7 @@ def visit_Getitem(self, node, frame): self.write(")") if self.environment.is_async: - self.write(")") + self.write("))") def visit_Slice(self, node, frame): if node.start is not None: diff --git a/tests/test_async.py b/tests/test_async.py index f7e27922e..d6c4a239a 100644 --- a/tests/test_async.py +++ b/tests/test_async.py @@ -579,3 +579,7 @@ def test_nonrecursive_loop_filter(self, test_env_async): def test_bare_async(self, test_env_async): t = test_env_async.from_string('{% extends "header" %}') assert t.render(foo=42) == "[42|23]" + + def test_awaitable_property_slicing(self, test_env_async): + t = test_env_async.from_string("{% for x in a.b[:1] %}{{ x }}{% endfor %}") + assert t.render(a=dict(b=[1, 2, 3])) == "1"