nodejs/node · error · NotImplementedError

This feature is not available for this version of Python

Error message

This feature is not available for this version of Python

What it means

Raised by Template.render_async's stub in environment.py. The base Template class ships stubs for the async methods that raise NotImplementedError; the real coroutine implementations are patched in from jinja2.asyncsupport, which is only imported on Python interpreters with async support. If the patch never landed (older/unsupported interpreter, or asyncsupport failed to import), calling render_async hits the stub.

Source

Thrown at tools/inspector_protocol/jinja2/environment.py:1020

        """
        vars = dict(*args, **kwargs)
        try:
            return concat(self.root_render_func(self.new_context(vars)))
        except Exception:
            exc_info = sys.exc_info()
        return self.environment.handle_exception(exc_info, True)

    def render_async(self, *args, **kwargs):
        """This works similar to :meth:`render` but returns a coroutine
        that when awaited returns the entire rendered template string.  This
        requires the async feature to be enabled.

        Example usage::

            await template.render_async(knights='that say nih; asynchronously')
        """
        # see asyncsupport for the actual implementation
        raise NotImplementedError('This feature is not available for this '
                                  'version of Python')

    def stream(self, *args, **kwargs):
        """Works exactly like :meth:`generate` but returns a
        :class:`TemplateStream`.
        """
        return TemplateStream(self.generate(*args, **kwargs))

    def generate(self, *args, **kwargs):
        """For very large templates it can be useful to not render the whole
        template at once but evaluate each statement after another and yield
        piece for piece.  This method basically does exactly that and returns
        a generator that yields one item after another as unicode strings.

        It accepts the same arguments as :meth:`render`.
        """
        vars = dict(*args, **kwargs)
        try:

View on GitHub (pinned to 1b2de5e052)

Solutions

  1. Ensure jinja2.asyncsupport imports cleanly (test `import jinja2.asyncsupport`) on the target interpreter.
  2. Run on a supported Python 3 interpreter and a Jinja2 version that ships asyncsupport.
  3. If async is genuinely unavailable, use the sync render() instead of render_async().

Example fix

# before
await template.render_async()   # NotImplementedError on unsupported interpreter
# after
result = template.render()      # sync path always available
Defensive patterns

Strategy: validation

Validate before calling

def async_render_available():
    try:
        import jinja2.asyncsupport  # noqa
        return True
    except ImportError:
        return False

Try / catch

try:
    result = await template.render_async()
except NotImplementedError:
    result = template.render()   # graceful sync fallback

Prevention

When it happens

Trigger: Calling await template.render_async() on a Python build where jinja2.asyncsupport was not imported (so the stub was not monkeypatched); running on an interpreter/Python version Jinja2 regards as lacking async support; an import error in asyncsupport that was silently swallowed leaving the stubs in place.

Common situations: Deploying to a minimal/embedded Python that excludes the async support module; pinning an old Jinja2 on a Python version predating async; an environment where asyncsupport.py is missing from the vendored tree.

Related errors


AI-assisted analysis of nodejs/node@1b2de5e052 (2026-08-13). Data as JSON: /api/errors/59e35bdf58b65118. Report an issue: GitHub.