Skip to content

TypeError: 'async for' requires an object with __aiter__ method, got ChainableUndefined #1293

@Jafnee

Description

@Jafnee

Expected Behavior

Able to iterate over ChainableUndefined.

Minimal code to reproduce

import asyncio
from jinja2 import Environment, ChainableUndefined

html = """
{% for x in data['y']['z'] %}
  {{ x }}
{% endfor %}
"""

jinja_env = Environment(
    enable_async=True,
    undefined=ChainableUndefined,
)

async def main():
    template = jinja_env.from_string(html)
    output = await template.render_async(data={})


if __name__ == '__main__':
    asyncio.run(main())

Stacktrace

Traceback (most recent call last):
  File "jinja_bug.py", line 21, in <module>
    asyncio.run(main())
  File "/usr/local/Cellar/python@3.8/3.8.5/Frameworks/Python.framework/Versions/3.8/lib/python3.8/asyncio/runners.py", line 43, in run
    return loop.run_until_complete(main)
  File "/usr/local/Cellar/python@3.8/3.8.5/Frameworks/Python.framework/Versions/3.8/lib/python3.8/asyncio/base_events.py", line 616, in run_until_complete
    return future.result()
  File "jinja_bug.py", line 17, in main
    output = await template.render_async(data={})
  File "./jinja_bug_mvp/env/lib/python3.8/site-packages/jinja2/asyncsupport.py", line 65, in render_async
    return self.environment.handle_exception()
  File "./jinja_bug_mvp/env/lib/python3.8/site-packages/jinja2/environment.py", line 832, in handle_exception
    reraise(*rewrite_traceback_stack(source=source))
  File "./jinja_bug_mvp/env/lib/python3.8/site-packages/jinja2/_compat.py", line 28, in reraise
    raise value.with_traceback(tb)
  File "./jinja_bug_mvp/env/lib/python3.8/site-packages/jinja2/asyncsupport.py", line 25, in concat_async
    await collect()
  File "./jinja_bug_mvp/env/lib/python3.8/site-packages/jinja2/asyncsupport.py", line 22, in collect
    async for event in async_gen:
  File "<template>", line 2, in top-level template code
  File "./jinja_bug_mvp/env/lib/python3.8/site-packages/jinja2/asyncsupport.py", line 180, in auto_aiter
    async for item in iterable:
TypeError: 'async for' requires an object with __aiter__ method, got ChainableUndefined

Actual Behaviour

TypeError is being raised when async is enabled. Seems to be working fine when rendering synchronously with enable_async=False.

Your Environment

  • Python version: 3.8.5
  • Jinja version: 2.11.2

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions