se torno un modello Jinja2 in questo modo: return render_response('home.htm', **context)
Come ottenere un elenco delle variabili correnti dal modello Jinja 2?
Come quindi ottenere un elenco delle variabili di contesto all'interno del modello?
se torno un modello Jinja2 in questo modo: return render_response('home.htm', **context)
Come ottenere un elenco delle variabili correnti dal modello Jinja 2?
Come quindi ottenere un elenco delle variabili di contesto all'interno del modello?
Tecnicamente, perché contesto non viene passato come un dizionario di nome, un po 'di lavoro è necessario per generare un elenco delle variabili di contesto all'interno di un modello. È possibile però.
Definire un Jinja context function per restituire l'oggetto jinja2.Context, che è essenzialmente un dizionario delle variabili globali/funzioni
rendere tale funzione disponibile nello spazio dei nomi globale; cioè un dizionario globals jinja2.Environment o jinja2.Template
Facoltativamente, oggetti filtro dal contesto; ad esempio, utilizzare callable()
per ignorare le funzioni di supporto globali predefinite di Jinja (intervallo, 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, chiamare render_response
con ('home.htm', context=context)
per rendere gli altri lavori soluzione.]
Grazie mille. Mi inchino alla tua superiore conoscenza di Jinja2. – Christian
Si noti che a causa del controllo 'callable', la soluzione ignorerebbe le funzioni che sono state esplicitamente passate come parte del contesto. Probabilmente non succede spesso, ma potrebbe fare la differenza. –
Vero. Questa semplice soluzione può sicuramente essere migliorata. Per esempio, se '' template'' è una società globale, '' GET_CONTEXT() '' può restituire un nuovo dizionario in base a '' context'' ma senza chiavi che esistono anche in '' template.globals''. – Garrett
Ecco come ottenere @crewbum's answer lavoro da un'applicazione Flask:
import jinja2
@jinja2.contextfunction
def get_context(c):
return c
app.jinja_env.globals['context'] = get_context
app.jinja_env.globals['callable'] = callable
Dove lo metti? – johnny
Nell'inizializzazione dell'app (o nella factory dell'app). Se si usano estensioni di una bottiglia, come flask-sqlalchemy, flask-login, ecc., Questo può essere nello stesso posto in cui sono stati creati. –
Come su Readin g la fonte del modello? Cosa c'è che non va? –