From: Armin Ronacher Date: Wed, 28 Dec 2016 14:33:14 +0000 (+0100) Subject: Added untested support for imports and includes in async mode X-Git-Tag: 2.9~69 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f61ffbfb8003f4ea6067a7f6efbf9bc711817415;p=thirdparty%2Fjinja.git Added untested support for imports and includes in async mode --- diff --git a/jinja2/asyncsupport.py b/jinja2/asyncsupport.py index e42a7131..765c3137 100644 --- a/jinja2/asyncsupport.py +++ b/jinja2/asyncsupport.py @@ -64,6 +64,13 @@ async def get_default_module_async(self): return rv +@internalcode +def get_default_module_impl(self): + if self.environment._async: + return self._get_default_module_async() + return self._get_default_module() + + def wrap_default_module(original_default_module): @internalcode def _get_default_module(self): @@ -89,6 +96,7 @@ def patch_template(): Template._get_default_module = wrap_default_module( Template._get_default_module) Template._get_default_module_async = get_default_module_async + Template._get_default_module_impl = get_default_module_impl Template.make_module_async = make_module_async diff --git a/jinja2/compiler.py b/jinja2/compiler.py index 1d9d5059..cd5c1cec 100644 --- a/jinja2/compiler.py +++ b/jinja2/compiler.py @@ -977,8 +977,8 @@ class CodeGenerator(NodeVisitor): 'template.new_context(context.parent, True, ' 'locals())):' % loop) else: - self.writeline('for event in template._get_default_module()' - '._body_stream:') + self.writeline('%s event in template._get_default_module_impl()' + '._body_stream:' % loop) self.indent() self.simple_write('event', frame) @@ -994,13 +994,16 @@ class CodeGenerator(NodeVisitor): self.writeline('l_%s = ' % node.target, node) if frame.toplevel: self.write('context.vars[%r] = ' % node.target) + if self.environment._async: + self.write('await ') self.write('environment.get_template(') self.visit(node.template, frame) self.write(', %r).' % self.name) if node.with_context: - self.write('make_module(context.parent, True, locals())') + self.write('make_module%s(context.parent, True, locals())' + % (self.environment._async and '_async' or '')) else: - self.write('_get_default_module()') + self.write('_get_default_module_impl()') if frame.toplevel and not node.target.startswith('_'): self.writeline('context.exported_vars.discard(%r)' % node.target) frame.assigned_names.add(node.target) @@ -1008,13 +1011,15 @@ class CodeGenerator(NodeVisitor): def visit_FromImport(self, node, frame): """Visit named imports.""" self.newline(node) - self.write('included_template = environment.get_template(') + self.write('included_template = %senvironment.get_template(' + % (self.environment._async and 'await ' or '')) self.visit(node.template, frame) self.write(', %r).' % self.name) if node.with_context: - self.write('make_module(context.parent, True)') + self.write('make_module%s(context.parent, True)' + % (self.environment._async and '_async' or '')) else: - self.write('_get_default_module()') + self.write('_get_default_module_impl()') var_names = [] discarded_names = [] diff --git a/jinja2/environment.py b/jinja2/environment.py index f91b01dc..1ebb4da2 100644 --- a/jinja2/environment.py +++ b/jinja2/environment.py @@ -1042,6 +1042,10 @@ class Template(object): self._module = rv = self.make_module() return rv + # This is what the compiler dispatches to from generated code. It + # might get swapped out by the async support + _get_default_module_impl = _get_default_module + @property def module(self): """The template as module. This is used for imports in the