@@ -902,12 +902,15 @@ def visit_Template(
902902 if not self .environment .is_async :
903903 self .writeline ("yield from parent_template.root_render_func(context)" )
904904 else :
905- self .writeline (
906- "async for event in parent_template.root_render_func(context):"
907- )
905+ self .writeline ("agen = parent_template.root_render_func(context)" )
906+ self .writeline ("try:" )
907+ self .indent ()
908+ self .writeline ("async for event in agen:" )
908909 self .indent ()
909910 self .writeline ("yield event" )
910911 self .outdent ()
912+ self .outdent ()
913+ self .writeline ("finally: await agen.aclose()" )
911914 self .outdent (1 + (not self .has_known_extends ))
912915
913916 # at this point we now have the blocks collected and can visit them too.
@@ -977,14 +980,20 @@ def visit_Block(self, node: nodes.Block, frame: Frame) -> None:
977980 f"yield from context.blocks[{ node .name !r} ][0]({ context } )" , node
978981 )
979982 else :
983+ self .writeline (f"gen = context.blocks[{ node .name !r} ][0]({ context } )" )
984+ self .writeline ("try:" )
985+ self .indent ()
980986 self .writeline (
981- f"{ self .choose_async ()} for event in"
982- f" context.blocks[{ node .name !r} ][0]({ context } ):" ,
987+ f"{ self .choose_async ()} for event in gen:" ,
983988 node ,
984989 )
985990 self .indent ()
986991 self .simple_write ("event" , frame )
987992 self .outdent ()
993+ self .outdent ()
994+ self .writeline (
995+ f"finally: { self .choose_async ('await gen.aclose()' , 'gen.close()' )} "
996+ )
988997
989998 self .outdent (level )
990999
@@ -1057,26 +1066,33 @@ def visit_Include(self, node: nodes.Include, frame: Frame) -> None:
10571066 self .writeline ("else:" )
10581067 self .indent ()
10591068
1060- skip_event_yield = False
1069+ def loop_body () -> None :
1070+ self .indent ()
1071+ self .simple_write ("event" , frame )
1072+ self .outdent ()
1073+
10611074 if node .with_context :
10621075 self .writeline (
1063- f"{ self . choose_async () } for event in template.root_render_func("
1076+ f"gen = template.root_render_func("
10641077 "template.new_context(context.get_all(), True,"
1065- f" { self .dump_local_context (frame )} )):"
1078+ f" { self .dump_local_context (frame )} ))"
1079+ )
1080+ self .writeline ("try:" )
1081+ self .indent ()
1082+ self .writeline (f"{ self .choose_async ()} for event in gen:" )
1083+ loop_body ()
1084+ self .outdent ()
1085+ self .writeline (
1086+ f"finally: { self .choose_async ('await gen.aclose()' , 'gen.close()' )} "
10661087 )
10671088 elif self .environment .is_async :
10681089 self .writeline (
10691090 "for event in (await template._get_default_module_async())"
10701091 "._body_stream:"
10711092 )
1093+ loop_body ()
10721094 else :
10731095 self .writeline ("yield from template._get_default_module()._body_stream" )
1074- skip_event_yield = True
1075-
1076- if not skip_event_yield :
1077- self .indent ()
1078- self .simple_write ("event" , frame )
1079- self .outdent ()
10801096
10811097 if node .ignore_missing :
10821098 self .outdent ()
0 commit comments