police jinja africa jinja2

africa - jinja2 filter list



Cómo obtener la lista de todas las variables en las plantillas jinja 2 (5)

Consulte la documentación de Jinja2 Meta API para más detalles.

Estoy tratando de obtener una lista de todas las variables y bloques en una plantilla. No quiero crear mi propio analizador para encontrar variables. Intenté usar el siguiente fragmento de código.

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

template.blocks es dict donde las claves son bloques, ¿cómo puedo obtener todas las variables dentro de los bloques?


Para el tema de mi pelícano, he creado una herramienta para analizar todas las variables jinja en mis archivos de plantillas.

Yo comparto mi codigo

Esta secuencia de comandos genera una configuración de muestra de todas las variables que existe en los archivos de plantilla y obtén variables de mi pelicanconf.py oficial

La función que extrae todas las variables del archivo de plantilla.

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

El guion completo

#!/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)

El resultado de la muestra de este programa.

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''

Para obtener más información sobre este script, consulte https://github.com/badele/pelican-theme-jesuislibre


Solución: 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 ))


Tenía la misma necesidad y he escrito una herramienta llamada jinja2schema . Proporciona un algoritmo heurístico para inferir tipos de plantillas Jinja2 y también se puede utilizar para obtener una lista de todas las variables de la plantilla, incluidas las anidadas.

Aquí hay un pequeño ejemplo de eso:

>>> 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'']


Ya que nadie ha respondido la pregunta y encontré la respuesta

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

Esto producirá una lista de variables no declaradas, ya que esto no se ejecuta en el tiempo de ejecución, sino que proporcionará una lista de todas las variables.

Nota: Esto producirá archivos html que se incluyen usando include y se extends .