summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Lord <davidism@gmail.com>2020-03-30 11:34:13 -0700
committerGitHub <noreply@github.com>2020-03-30 11:34:13 -0700
commit786867a47cdff625ebdab9fa1dbfe65a0c7e1924 (patch)
treeec0f45d311f8bd6764b1ad1ad6b8318aa8f2b54e
parent5f95471a68b527cf47fb8391c661f72171b63cc3 (diff)
parent0fd45a4dc7c47e49de91058a226c6b1c96d86483 (diff)
downloadjinja2-786867a47cdff625ebdab9fa1dbfe65a0c7e1924.tar.gz
Merge pull request #1181 from bartfeenstra/async-namespace
Allow namespaces to be used in asynchronously rendered templates.
-rw-r--r--CHANGES.rst2
-rw-r--r--src/jinja2/utils.py3
-rw-r--r--tests/test_async.py11
3 files changed, 15 insertions, 1 deletions
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())