Как прочитать контекстную переменную jinja

#python #jinja2

#python #jinja2

Вопрос:

В моей основной строке я хочу прочитать переменную из текущего контекста шаблона после того, как шаблон был отрисован. Эта переменная была «установлена» в шаблоне. Я могу получить доступ к переменной в контекстной функции, но как получить к ней доступ в моей основной строке.

 result = template.render({'a' : "value-1" })
# in the template {% set b = "value-2" %}
b = ?
  

Обновление : я нашел решение в исходном коде webapp2. Строка :

 b = template.module.b
  

Ответ №1:

Я выяснил, с помощью источника webapp2-extras, что доступ к текущему контексту jinja возможен в основной строке python. Смотрите также: класс jinja2.Шаблон в документации jinja.

Основная строка Python :

 result = template.render({'a' : "value-1" })
# in the template {% set b = "value-2" %}
b = template.module.b
  

Спасибо за вашу помощь.

Ответ №2:

Я не рекомендую вам делать то, что вы просите, и вместо этого думать о лучшем решении, в любом случае, вот хакерский ответ:

 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'
  

Комментарии:

1. Я нашел другое решение своей проблемы, просмотрев код webapp2. Строка: b = template.module.b