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
.