Как пользовательский тег jinja2 может взаимодействовать с контекстом запроса фляги


person sa125    schedule 31.03.2015    source источник


Ответы (1)


Контекстная ссылка

Да, это возможно с помощью jinja2.nodes.ContextReference(). См. справочник по API здесь.

Расслабься, я проведу тебя через это. :)

Сначала расширение:

class ActiveCheckerExtension(jinja2.ext.Extension):
    """
    This will give us a {% check_active %} tag.
    """

    template = 'Active is : %s'
    tags = set(['check_active'])

    def _render_tag(self, context, caller):
        return jinja2.Markup(self.template % unicode(context['active']))

    def parse(self, parser):
        ctx_ref = jinja2.nodes.ContextReference()
        lineno = next(parser.stream).lineno
        node = self.call_method('_render_tag', [ctx_ref], lineno=lineno)
        return jinja2.nodes.CallBlock(node, [], [], [], lineno=lineno)

Затем добавим его в файл jinja2 Flask.

app.jinja_env.add_extension(ActiveCheckerExtension)

Теперь в вашем шаблоне вы можете сделать:

{% check_active %}

Убедитесь, что active определено во всех шаблонах, к которым вы добавляете тег, иначе вы получите KeyError, потому что в контексте не будет этой переменной шаблона.

person Augiwan    schedule 17.05.2015