Как получить список всех переменных в шаблонах jinja 2

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

from jinja2 import Environment, PackageLoader
env = Environment(loader=PackageLoader('gummi', 'templates'))
template = env.get_template('chat.html')

template.blocks - это dict, где ключи - это блоки, как я могу получить все переменные внутри блоков?


person Kracekumar    schedule 24.11.2011    source источник


Ответы (4)


Так как никто не ответил на вопрос, и я нашел ответ

from jinja2 import Environment, PackageLoader, meta
env = Environment(loader=PackageLoader('gummi', 'templates'))
template_source = env.loader.get_source(env, 'page_content.html')
parsed_content = env.parse(template_source)
meta.find_undeclared_variables(parsed_content)

Это даст список необъявленных переменных, поскольку это не выполняется во время выполнения, это даст список всех переменных.

Примечание. Это даст файлы html, которые включаются с использованием include и extends.

person Kracekumar    schedule 27.11.2011
comment
К сожалению, не получает свойства переменных (т.е. {{ something.nested }} предоставляет set(['something']) - person Bemis; 13.03.2014
comment
У меня есть шаблон, который содержит такие переменные, как {{ properties.env }} , {{ proerties.sys }} и т. д. Когда я использую вышеуказанную функцию, я получаю свойства, но мне интересно получить один уровень глубже, т.е. properties.env или properties.sys . Может кто подскажет. - person sudhanshu; 09.05.2016

У меня была такая же потребность, и я написал инструмент под названием jinja2schema. Он предоставляет эвристический алгоритм для вывода типов из шаблонов Jinja2, а также может использоваться для получения списка всех переменных шаблона, включая вложенные.

Вот краткий пример того, как это сделать:

>>> import jinja2
>>> import jinja2schema
>>>
>>> template = '''
... {{ x }}
... {% for y in ys %}
...     {{ y.nested_field_1 }}
...     {{ y.nested_field_2 }}
... {% endfor %}
... '''
>>> variables = jinja2schema.infer(template)
>>>
>>> variables
{'x': <scalar>,
 'ys': [{'nested_field_1': <scalar>, 'nested_field_2': <scalar>}]}
>>>
>>> variables.keys()
['x', 'ys']
>>> variables['ys'].item.keys()
['nested_field_2', 'nested_field_1']
person aromanovich    schedule 11.10.2014
comment
(Примечание: jinja2schema использует Environment.parse для получения AST. из шаблона, а затем используйте его.) - person user202729; 31.05.2019

Для моей темы пеликана я создал инструменты для анализа всех переменных jinja в моих файлах шаблонов.

Я делюсь своим кодом

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

Функция, извлекающая все переменные из файла шаблона

def get_variables(filename):
    env = Environment(loader=FileSystemLoader('templates'))
    template_source = env.loader.get_source(env, filename)[0]
    parsed_content = env.parse(template_source)

Полный сценарий

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# use:
# generate_pelicanconf-sample.py my_official_blog/pelicanconf.py

import sys
import imp
import os

from jinja2 import Environment, FileSystemLoader, meta


# Search all template files
def list_html_templates():
    dirList = os.listdir('templates')

    return dirList


# get all variable in template file
def get_variables(filename):
    env = Environment(loader=FileSystemLoader('templates'))
    template_source = env.loader.get_source(env, filename)[0]
    parsed_content = env.parse(template_source)

    return meta.find_undeclared_variables(parsed_content)


# Check if the pelicanconf.py is in param
if len(sys.argv) != 2:
    print("Please indicate the pelicanconf.py file")
    sys.exit()

# Get all vars from templates files
all_vars = set()
files = list_html_templates()
for fname in files:
    variables = get_variables(fname)
    for var in variables:
        if var.isupper():
            all_vars.add(var)

m = imp.load_source('pelicanconf', sys.argv[1])

# Show pelicanconf.py vars content
for var in all_vars:
    varname = 'm.%s' % var
    if var in m.__dict__:
        print ("%s = %s" % (var, repr(m.__dict__[var])))


    return meta.find_undeclared_variables(parsed_content)

Пример результата этой программы

LINKS = ((u'Home', u'/'), (u'archives', u'/archives.html'), (u'tags', u'/tags.html'), (u'A propos', u'http://bruno.adele.im'))
SITESUBTITLE = u'Une famille compl\xe8tement 633<'
DEFAULT_LANG = u'fr'
SITEURL = u'http://blog.jesuislibre.org'
AUTHOR = u'Bruno Adel\xe9'
SITENAME = u'Famille de geeks'
SOCIAL = ((u'adele', u'http://adele.im'), (u'feed', u'http://feeds.feedburner.com/FamilleDeGeek'), (u'twitter', u'http://twitter.com/jesuislibre.org'), (u'google+', u'https://plus.google.com/100723270029692582967'), (u'blog', u'http://blog.jesuislibre.org'), (u'facebook', u'http://www.facebook.com/bruno.adele'), (u'flickr', u'http://www.flickr.com/photos/b_adele'), (u'linkedin', u'http://fr.linkedin.com/in/brunoadele'))
FEED_DOMAIN = u'http://blog.jesuislibre.org'
FEED_ALL_ATOM = u'feed.atom'
DISQUS_SITENAME = u'blogdejesuislibreorg'
DEFAULT_PAGINATION = 10
GITHUB_BLOG_SITE = u'https://github.com/badele/blog.jesuislibre.org'

Подробнее об этом скрипте см. https://github.com/badele/pelican-theme-jesuislibre< /а>

person Bruno Adelé    schedule 15.09.2013

Решение: https://gist.github.com/sxslex/822bd2405885294747b86aac187f1aa8

def template(html, **params):
    import jinja2
    env = jinja2.Environment(loader=FileSystemLoader(''))

    def tojson(s):                                       
        import json
        return json.dumps(s)
    env.filters['tojson'] = tojson
    template = env.from_string(html)
    return template.render(context=params, **params)

print(template('{{ context|tojson }}', name='slex', value=39 ))
person SleX    schedule 30.03.2017
comment
Это отвечает на совершенно другой вопрос; а именно, какие параметры были переданы. ОП просил список имен, используемых в шаблоне. - person Martijn Pieters; 24.10.2019