summaryrefslogtreecommitdiff
path: root/jinja2/asyncsupport.py
blob: 534fb80f0bcc9ef92940531985e0ce3df67de564 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import sys
import asyncio
import inspect

from jinja2.utils import concat


async def render_async(self, *args, **kwargs):
    if not self.environment._async:
        raise RuntimeError('The environment was not created with async mode '
                           'enabled.')

    vars = dict(*args, **kwargs)
    ctx = self.new_context(vars)
    rv = []
    async def collect():
        async for event in self.root_render_func(ctx):
            rv.append(event)

    try:
        await collect()
        return concat(rv)
    except Exception:
        exc_info = sys.exc_info()
    return self.environment.handle_exception(exc_info, True)


def wrap_render_func(original_render):
    def render(self, *args, **kwargs):
        if not self.environment._async:
            return original_render(self, *args, **kwargs)
        loop = asyncio.get_event_loop()
        return loop.run_until_complete(self.render_async(self, *args, **kwargs))
    return render


def patch_template():
    from jinja2 import Template
    Template.render_async = render_async
    Template.render = wrap_render_func(Template.render)


def patch_all():
    patch_template()


async def auto_await(value):
    if inspect.isawaitable(value):
        return await value
    return value