Comment obtenir une liste des variables actuelles du modèle Jinja 2?

Si je retourne un modèle Jinja2 comme ceci: return render_response('home.htm', **context)

Comment obtenir une liste des variables dans le contexte à partir du modèle?

22
demandé sur Christian 2010-08-03 21:02:46

2 réponses

Techniquement, étant donné que le contexte n'est pas transmis en tant que dictionnaire nommé, un peu de travail est nécessaire pour générer une liste des variables de contexte à partir d'un modèle. C'est possible cependant.

  1. Définissez une fonction de contexte Jinja pour renvoyer le jinja2.Context object, qui est essentiellement un dictionnaire des variables/fonctions globales

  2. Rendez cette fonction disponible dans l'espace de noms global; c'est-à-dire un jinja2.Environnement ou jinja2.Modèle globals dictionnaire

  3. Optionnellement, filtrez les objets du contexte; par exemple, utilisez callable() pour ignorer les fonctions d'assistance globale par défaut de Jinja (range,joiner, etc.). Cela peut être fait dans la fonction context ou le modèle; partout où cela a le plus de sens.

Exemple:

>>> import jinja2
>>> 
>>> @jinja2.contextfunction
... def get_context(c):
...         return c
... 
>>> tmpl = """ 
... {% for key, value in context().items() %}
...     {% if not callable(value) %}
...         {{ key }}:{{ value }}
...     {% endif %}
... {% endfor %}
... """
>>> 
>>> template = jinja2.Template(tmpl)
>>> template.globals['context'] = get_context
>>> template.globals['callable'] = callable
>>>
>>> context = {'a': 1, 'b': 2, 'c': 3}
>>> 
>>> print(template.render(**context))
        a:1
        c:3
        b:2

[Alternativement, appelez - render_response avec ('home.htm', context=context) pour l'autre solution.]

36
répondu Garrett 2010-08-11 23:35:30

Voici comment obtenir la réponse de @crewbum à partir d'une application Flask:

import jinja2

@jinja2.contextfunction
def get_context(c):
    return c

app.jinja_env.globals['context'] = get_context
app.jinja_env.globals['callable'] = callable
1
répondu joemaller 2017-05-23 12:07:19