templates - async - jinja2 dump
¿Cómo obtener una lista de variables actuales de la plantilla Jinja 2? (2)
Si devuelvo una plantilla de Jinja2 de la siguiente manera: return render_response(''home.htm'', **context)
¿Cómo puedo obtener una lista de las variables en contexto desde dentro de la plantilla?
A continuación se detalla cómo obtener la respuesta de @ crewbum desde una aplicación Flask:
import jinja2
@jinja2.contextfunction
def get_context(c):
return c
app.jinja_env.globals[''context''] = get_context
app.jinja_env.globals[''callable''] = callable
Técnicamente, dado que el contexto no se pasa como un diccionario con nombre, se requiere un poco de trabajo para generar una lista de las variables de contexto desde dentro de una plantilla. Es posible sin embargo.
Defina una función de contexto Jinja para devolver el objeto jinja2.Context, que es esencialmente un diccionario de las variables / funciones globales
Haga que esa función esté disponible en el espacio de nombres global; es decir, un diccionario global jinja2.Environment o jinja2.Template
Opcionalmente, filtrar objetos del contexto; por ejemplo, use
callable()
para omitir las funciones de ayuda global predeterminadas de Jinja (rango, unión, etc.). Esto se puede hacer en la función de contexto o la plantilla; donde sea que tenga más sentido.
Ejemplo:
>>> 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
[Alternativamente, llame a render_response
con (''home.htm'', context=context)
para que la otra solución funcione.]