В моей основной строке я хочу прочитать переменную из контекста текущего шаблона после визуализации шаблона. Эта переменная была "установлена" в шаблоне. Я могу получить доступ к переменной в контексте функции, но как получить доступ к ней в моей основной линии.
result = template.render({'a' : "value-1" })
# in the template {% set b = "value-2" %}
b = ?
Обновление: я нашел решение в источнике webapp2. Линия:
b = template.module.b
Я узнал, с помощью источника webapp2-extras, что доступ к текущему контексту jinja возможен в основной строке python. См. Также: class jinja2.Template в документации jinja.
Python mainline:
result = template.render({'a' : "value-1" })
# in the template {% set b = "value-2" %}
b = template.module.b
Спасибо за вашу помощь.
Я не рекомендую вам делать то, о чем вы просите, и вместо этого подумайте о лучшем решении, так или иначе, вот хакерский ответ:
from jinja2 import Template
class MyImprovedTemplate(Template):
def render(self, *args, **kwargs):
# this is copy-pasted from jinja source, context added to return
vars = dict(*args, **kwargs)
context = self.new_context(vars)
try:
return context, concat(self.root_render_func(context))
except Exception:
exc_info = sys.exc_info()
return context, self.environment.handle_exception(exc_info, True)
>>> t = MyImprovedTemplate('{% set b = 2 %}')
>>> context, s = t.render()
>>> context['b']
'2'