Come ottenere un elenco di variabili correnti dal modello Jinja 2?

Se restituisco un modello Jinja2 in questo modo: return render_response('home.htm', **context)

Come si ottiene quindi un elenco delle variabili nel contesto all’interno del modello?

Tecnicamente, poiché il contesto non viene passato come dizionario con nome, è necessario un minimo di lavoro per generare un elenco delle variabili di contesto all’interno di un modello. È ansible però.

  1. Definire una funzione di contesto Jinja per restituire l’object jinja2.Context, che è essenzialmente un dizionario delle variabili / funzioni globali

  2. Rendi la funzione disponibile nello spazio dei nomi globale; cioè un dizionario jinja2.Environment o jinja2.Template globals

  3. Facoltativamente, filtra gli oggetti dal contesto; per esempio, usa callable() per saltare le funzioni di supporto globali predefinite di Jinja (range, joiner, ecc.). Questo può essere fatto nella funzione di contesto o nel modello; ovunque abbia più senso.

Esempio:

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

[In alternativa, chiama render_response con ('home.htm', context=context) per far funzionare l’altra soluzione.]

Ecco come ottenere la risposta di @ crewbum lavorando da un’app Flask:

 import jinja2 @jinja2.contextfunction def get_context(c): return c app.jinja_env.globals['context'] = get_context app.jinja_env.globals['callable'] = callable