diff options
author | David Lord <davidism@gmail.com> | 2020-03-30 11:34:13 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-03-30 11:34:13 -0700 |
commit | 786867a47cdff625ebdab9fa1dbfe65a0c7e1924 (patch) | |
tree | ec0f45d311f8bd6764b1ad1ad6b8318aa8f2b54e | |
parent | 5f95471a68b527cf47fb8391c661f72171b63cc3 (diff) | |
parent | 0fd45a4dc7c47e49de91058a226c6b1c96d86483 (diff) | |
download | jinja-786867a47cdff625ebdab9fa1dbfe65a0c7e1924.tar.gz |
Merge pull request #1181 from bartfeenstra/async-namespace
Allow namespaces to be used in asynchronously rendered templates.
-rw-r--r-- | CHANGES.rst | 2 | ||||
-rw-r--r-- | src/jinja2/utils.py | 3 | ||||
-rw-r--r-- | tests/test_async.py | 11 |
3 files changed, 15 insertions, 1 deletions
diff --git a/CHANGES.rst b/CHANGES.rst index 62b1b072..579b80b9 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 94581ca8..b422ba96 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 11efd849..2b9974e3 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()) |