Jinja: Implemente el asistente de plantilla incorporado para volcar las variables de plantilla disponibles

Creado en 17 ene. 2013  ·  16Comentarios  ·  Fuente: pallets/jinja

El motor de plantillas Smarty tiene un {debug} incorporado muy conveniente que brinda una descripción general rápida de las variables disponibles para el diseñador.

Smarty_debug_console

Sería bueno tener las mismas cosas en Jinja2 por defecto

Comentario más útil

image

De acuerdo a lo pedido. Verás que los contenidos están organizados (y ordenados) por variables de contexto, filtros y pruebas. Además, aquí hay una vista ampliada en una pantalla con algunas variables de contexto "interesantes" más. Vea cómo el límite de profundidad = 3 es suficiente para mostrar un poco de detalle, sin incurrir en la posibilidad de una salida demasiado anidada ya que, creo, lo más solicitado es saber exactamente qué variables de contexto (nivel superior) están presentes y no el profundidad total de cualquier estructura:

image

También es probable que vea que es trivial cambiar/ampliar los detalles de lo que se muestra (o lo será, para alguien que sabe cómo funciona el analizador... no estoy en ese bendito círculo :-)).

Todos 16 comentarios

Tendría que comprobarlo, pero creo que esto debería funcionar:

<h2>locals()</h2>
<pre>{{ locals() }}</pre>
<h2>globals()</h2>

... https://stackoverflow.com/questions/3398850/how-to-get-a-list-of-current-variables-from-jinja-2-template

@mitsuhiko de https://stackoverflow.com/a/13757358/188833 :

import jinja2

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

app.jinja_env.globals['context'] = get_context
app.jinja_env.globals['callable'] = callable

para la depuración, por ejemplo, pyramid_debugtoolbar puede mostrar el contexto de la plantilla si la función de vista (en mi humilde opinión, abstraída apropiadamente) simplemente devuelve un objeto de contexto (por ejemplo, dict, OrderedDict)

caso de uso

Mi caso de uso aquí es pasar algunos argumentos de una utilidad CLI a una plantilla jinja2 (donde me gustaría definir los valores predeterminados dentro de la plantilla (por ejemplo, para Dockerfiles (sin autoescape , de todas las cosas)))

Lo que me gustaría hacer es

{% set ENVVAR=context.get('ENVVAR', 'DEFAULT') %}

pero, por desgracia, el objeto real context es [...]

@westurner , entonces, ¿funciona? No puedo verificarlo en este momento, pero me parece que {{ locals() }} debería fallar si contiene bytes no convertibles.

  • json.dumps(locals()) no funcionará sin un JSONEncoder personalizado (con, por ejemplo repr() para [objetos de código,])
  • tal vez pprint.pformat(locals()) ? (esto sería un incorporado conveniente)
  • ... autoescape=True entonces evitaría XSS

Esto sería una gran ayuda al extender las plantillas de una aplicación de terceros. Actualmente estoy usando jeroglíficos para crear presentaciones de diapositivas, que se basan en sphinx y, por lo tanto, en Jinja2.

Extendí el tema de jeroglíficos predeterminado, y lo que me gustaría saber es si la plantilla contiene alguna variable que me diga si estoy en una diapositiva o no. Quizás la variable esté ahí, quizás no. Así que actualmente estoy hurgando dentro del código fuente del jeroglífico para encontrar lo que necesito.

Poder simplemente volcar todas las variables disponibles directamente desde dentro de la plantilla (es decir, sin modificar ningún código de Python) haría que esto fuera mucho más rápido y fácil. Entonces, digamos que ser capaz de hacer algo como esto sería bueno:

{% extends "!layout.html %}

{# ... or any other sensible name #}
{% dump_variables() %}

{% block body %}
Hello World!
super()
Goodbye World
{% endblock %}

De esta manera, podría introspeccionar cualquier jeroglífico que me ofrezca mientras desarrollo el nuevo tema.

Creé una extensión para este propósito, se puede encontrar en https://github.com/niwinz/django-jinja/files/1607805/jinja_extensions.py.txt

@ShaheedHaque alguna pantalla?

Si abre el archivo, los comentarios tienen un ejemplo de la salida. Si
necesario, puedo proporcionar una captura de pantalla real cuando llegue a casa esta noche...

El 6 de enero de 2018 a las 02:23, "anatoly techtonik" [email protected] escribió:

@ShaheedHaque https://github.com/shaheedhaque ¿Alguna pantalla?


Estás recibiendo esto porque te mencionaron.
Responda a este correo electrónico directamente, véalo en GitHub
https://github.com/pallets/jinja/issues/174#issuecomment-355716273 , o silenciar
la amenaza
https://github.com/notifications/unsubscribe-auth/AEp7KdBBslHJPIGp5VliuF74bxSZTk-wks5tHtkEgaJpZM4AXefd
.

Sería muy bueno comparar la pantalla de @ShaheedHaque con la salida de Smarty de la primera publicación.

image

De acuerdo a lo pedido. Verás que los contenidos están organizados (y ordenados) por variables de contexto, filtros y pruebas. Además, aquí hay una vista ampliada en una pantalla con algunas variables de contexto "interesantes" más. Vea cómo el límite de profundidad = 3 es suficiente para mostrar un poco de detalle, sin incurrir en la posibilidad de una salida demasiado anidada ya que, creo, lo más solicitado es saber exactamente qué variables de contexto (nivel superior) están presentes y no el profundidad total de cualquier estructura:

image

También es probable que vea que es trivial cambiar/ampliar los detalles de lo que se muestra (o lo será, para alguien que sabe cómo funciona el analizador... no estoy en ese bendito círculo :-)).

Parece útil. Entonces, ¿por qué no llenar un PR?

Estaría encantado de hacerlo si me dieran alguna orientación sobre en qué parte del código base ninja debería residir el nuevo código (no estoy familiarizado con este proyecto).

Yo tampoco, pero https://github.com/pallets/jinja/blob/master/jinja2/ext.py parece un buen comienzo.

Ver PR #798.

Estará disponible como una nueva extensión en 2.11.

¡Gracias!

Los documentos de extensión de depuración deben advertir a los usuarios sobre
divulgación de información sensible
a través de la etiqueta {% debug %} y cómo determinar si la extensión
está habilitado (para que un analizador estático pueda identificar que alguien olvidó
elimine {% debug .* %} antes del lanzamiento.

983

El viernes 4 de octubre de 2019, David Lord [email protected] escribió:

Cerrado #174.


Estás recibiendo esto porque te mencionaron.
Responda a este correo electrónico directamente, véalo en GitHub o silencie el hilo.

¿Fue útil esta página
0 / 5 - 0 calificaciones