2011-11-24 22 views
22

Estoy tratando de obtener una lista de todas las variables y bloques en una plantilla. No quiero crear mi propio analizador para encontrar variables. Traté de usar el siguiente fragmento.Cómo obtener la lista de todas las variables en las plantillas de jinja 2

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?

Respuesta

38

ya que nadie ha respondido a la pregunta y me encontré con 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) 

Esta lista de variables no declaradas dará lugar ya que este no se ejecuta en tiempo de ejecución, es la lista de todas las variables producirá.

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

+0

+1 - gracias por publicar la respuesta! –

+1

Bienvenido :), pensé que la respuesta podría ayudar a alguien. – Kracekumar

+5

Lamentablemente no recoge las propiedades de los vars (es decir, {{something.nested}} proporciona un conjunto (['algo']) – Bemis

4

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

comparto mi código

Este script genera un ejemplo de configuración de todas las variables existe en los archivos de plantilla y obtener una variables a partir de mi pelicanconf.py oficial

La función que extraer 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 guión 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 más detalle de este script ver https://github.com/badele/pelican-theme-jesuislibre

6

que tenían 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 usar para obtener una lista de todas las variables de plantilla, incluidas las anidadas.

Aquí es un ejemplo corto de hacer 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'] 
1

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)) 
+0

el enlace github no funciona – HDJEMAI

Cuestiones relacionadas