From 0fd45a4dc7c47e49de91058a226c6b1c96d86483 Mon Sep 17 00:00:00 2001 From: Bart Feenstra Date: Sat, 28 Mar 2020 16:18:58 +0000 Subject: namespace object works in async templates --- CHANGES.rst | 2 ++ src/jinja2/utils.py | 3 ++- tests/test_async.py | 11 +++++++++++ 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/CHANGES.rst b/CHANGES.rst index 62b1b07..579b80b 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -23,6 +23,8 @@ Unreleased :pr:`1182` - Fix line numbers in error messages when newlines are stripped. :pr:`1178` +- The special ``namespace()`` assignment object in templates works in + async environments. :issue:`1180` Version 2.11.1 diff --git a/src/jinja2/utils.py b/src/jinja2/utils.py index 94581ca..b422ba9 100644 --- a/src/jinja2/utils.py +++ b/src/jinja2/utils.py @@ -697,7 +697,8 @@ class Namespace(object): self.__attrs = dict(*args, **kwargs) def __getattribute__(self, name): - if name == "_Namespace__attrs": + # __class__ is needed for the awaitable check in async mode + if name in {"_Namespace__attrs", "__class__"}: return object.__getattribute__(self, name) try: return self.__attrs[name] diff --git a/tests/test_async.py b/tests/test_async.py index 11efd84..2b9974e 100644 --- a/tests/test_async.py +++ b/tests/test_async.py @@ -578,3 +578,14 @@ class TestAsyncForLoop(object): 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" + + +def test_namespace_awaitable(test_env_async): + async def _test(): + t = test_env_async.from_string( + '{% set ns = namespace(foo="Bar") %}{{ ns.foo }}' + ) + actual = await t.render_async() + assert actual == "Bar" + + run(_test()) -- cgit v1.2.1