Jinja: Implemente o ajudante de modelo integrado para despejar variáveis ​​de modelo disponíveis

Criado em 17 jan. 2013  ·  16Comentários  ·  Fonte: pallets/jinja

O mecanismo de modelo Smarty possui um {debug} embutido muito conveniente que fornece uma visão geral rápida das variáveis ​​disponíveis para o designer.

Smarty_debug_console

Seria bom ter as mesmas coisas no Jinja2 por padrão

Comentários muito úteis

image

Como pedido. Você verá que o conteúdo é organizado (e classificado) por variáveis ​​de contexto, filtros e testes. Além disso, aqui está uma visão ampliada em uma tela com mais algumas variáveis ​​de contexto "interessantes". Veja como o limite para depth=3 é suficiente para mostrar um pouco de detalhe, sem incorrer na possibilidade de saída excessivamente aninhada, pois, acredito, o mais solicitado é saber exatamente quais variáveis ​​de contexto (nível superior) estão presentes e não as profundidade total de qualquer estrutura:

image

Você provavelmente também verá que é trivial alterar/estender os detalhes do que é mostrado (ou será, para alguém que sabe como o analisador funciona ... não estou nesse círculo abençoado :-)).

Todos 16 comentários

Eu teria que verificar, mas acho que isso deve 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 depuração, por exemplo, pirâmide_debugtoolbar pode mostrar o contexto do modelo se a função de visualização - IMHO adequadamente abstraído - apenas retornar um objeto de contexto (por exemplo, dict, OrderedDict)

caso de uso

Meu caso de uso aqui é passar alguns argumentos de um utilitário CLI para um modelo jinja2 (onde eu gostaria de definir padrões dentro do modelo (por exemplo, para Dockerfiles (sem autoescape , de todas as coisas))

O que eu gostaria de fazer é

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

mas, infelizmente, o objeto context real é [...]

@westturner , então funciona? Não consigo verificar agora, mas parece-me que {{ locals() }} deve falhar se contiver bytes não conversíveis.

  • json.dumps(locals()) não funcionará sem um JSONEncoder personalizado (com, por exemplo repr() para [objetos de código,])
  • talvez pprint.pformat(locals()) ? (este seria um built-in conveniente)
  • ... autoescape=True impediria então o XSS

Isso seria uma benção ao estender modelos de um aplicativo de terceiros. Atualmente, estou usando o hieróglifo para criar apresentações de slides, que se baseiam na esfinge e, portanto, no Jinja2.

Eu estendi o tema padrão de hieróglifos, e o que eu gostaria de descobrir é se o modelo contém alguma variável que me diz se estou em um slide ou não. Talvez a variável esteja lá, talvez não. Então, atualmente estou vasculhando o código-fonte do hieróglifo para encontrar o que preciso.

Ser capaz de simplesmente despejar todas as variáveis ​​disponíveis diretamente de dentro do modelo (ou seja, sem modificar nenhum código Python) tornaria isso muito mais rápido e fácil. Então, digamos que ser capaz de fazer algo assim seria bom:

{% extends "!layout.html %}

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

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

Dessa forma, eu poderia introspectar qualquer hieróglifo que me oferecesse enquanto desenvolvia o novo tema.

Criei uma extensão para este fim, ela pode ser encontrada em https://github.com/niwinz/django-jinja/files/1607805/jinja_extensions.py.txt

@ShaheedHaque alguma tela?

Se você abrir o arquivo, os comentários terão um exemplo da saída. Se
necessário, posso fornecer uma captura de tela real quando chegar em casa hoje à noite ...

Em 6 de janeiro de 2018 02:23, "anatoly techtonik" [email protected] escreveu:

@ShaheedHaque https://github.com/shaheedhaque alguma tela?


Você está recebendo isso porque foi mencionado.
Responda a este e-mail diretamente, visualize-o no GitHub
https://github.com/pallets/jinja/issues/174#issuecomment-355716273 ou silenciar
o segmento
https://github.com/notifications/unsubscribe-auth/AEp7KdBBslHJPIGp5VliuF74bxSZTk-wks5tHtkEgaJpZM4AXefd
.

A tela @ShaheedHaque seria muito boa para comparar com a saída do Smarty do primeiro post.

image

Como pedido. Você verá que o conteúdo é organizado (e classificado) por variáveis ​​de contexto, filtros e testes. Além disso, aqui está uma visão ampliada em uma tela com mais algumas variáveis ​​de contexto "interessantes". Veja como o limite para depth=3 é suficiente para mostrar um pouco de detalhe, sem incorrer na possibilidade de saída excessivamente aninhada, pois, acredito, o mais solicitado é saber exatamente quais variáveis ​​de contexto (nível superior) estão presentes e não as profundidade total de qualquer estrutura:

image

Você provavelmente também verá que é trivial alterar/estender os detalhes do que é mostrado (ou será, para alguém que sabe como o analisador funciona ... não estou nesse círculo abençoado :-)).

Parece útil. Então, por que não preencher um PR?

Eu ficaria feliz em fazer isso com alguma orientação sobre onde na base de código ninja o novo código deve ficar (não estou familiarizado com este projeto).

Eu também não, mas https://github.com/pallets/jinja/blob/master/jinja2/ext.py parece um bom começo.

Veja PR nº 798.

Estará disponível como uma nova extensão em 2.11.

Obrigado!

Os documentos de extensão de depuração devem alertar os usuários sobre
divulgação de informações confidenciais
através da tag {% debug %} e como determinar se a extensão
está habilitado (para que um analisador estático possa identificar que alguém esqueceu de
remova {% debug .* %} antes do lançamento.

983

Na sexta-feira, 4 de outubro de 2019, David Lord [email protected] escreveu:

Fechado #174.


Você está recebendo isso porque foi mencionado.
Responda a este e-mail diretamente, visualize-o no GitHub ou silencie a conversa.

Esta página foi útil?
0 / 5 - 0 avaliações