Depurando modelos Jinja2 no VSCode

Aug 21 2020

Então eu encontrei a "jinja: "true"opção para launch.json e estou tentando fazer a depuração do jinja funcionar, sem sucesso até agora.

Meu launch.json é atualmente:

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": " uvicorn debug",
            "type": "python",
            "request": "launch", // set to "test" for "justMyCode" to work. 
            "module": "uvicorn",
            "args":
            [
                "project.asgi:app",
                "--reload",
            ],
            "jinja": true,
            "justMyCode": false
        }
    ] }

Eu enfrentei um problema que não conseguia configurar pontos de interrupção no arquivo de modelo jinja, mas resolvi adicionando "debug.allowBreakpointsEverywhere": trueàs configurações do vscode.

Minhas perguntas são as seguintes:
a) Como o modelo de depuração deve funcionar? Eu adiciono um ponto de interrupção em qualquer lugar do modelo e a execução para aí? Ou talvez isso 'jinja': truesignifique algo completamente diferente?
b) Com base na resposta em a), se os pontos de interrupção no arquivo de modelo jinja funcionarem, como fazer isso acontecer, já que atualmente eles parecem ser simplesmente ignorados?

Muito obrigado!

Respostas

2 rioV8 Aug 26 2020 at 19:40

Primeiro, tentei o exemplo na página da Wikipédia de Jinja

**jinja-test.py**

from jinja2 import Template
with open('example.html.jinja') as f:
    tmpl = Template(f.read())
print tmpl.render(
    variable = 'Value with <unsafe> data',
    item_list = [1, 2, 3, 4, 5, 6]
)

**example.html.jinja**

<!DOCTYPE html>
<html>
  <head>
    <title>{{ variable|escape }}</title>
  </head>
  <body>
  {%- for item in item_list %}
    {{ item }}{% if not loop.last %},{% endif %}
  {%- endfor %}
  </body>
</html>

Certifique-se de que o tipo de idioma do arquivo de modelo esteja definido como Jinja. Caso contrário, você não pode definir pontos de interrupção.

Como o arquivo foi lido em uma string antes de ser fornecido à classe Jinja Template, não havia nenhum link para o ponto de interrupção definido no modelo.

Lendo o código-fonte de jinja2.Templatedescobri que a forma preferida de criar um jinja2.Templateé por meio da jinja2.Environmentinstância.

Após uma pesquisa, encontrei outro exemplo de uso do Jinja no SO usando o jinja2.Environmenta Loader .

**jinja-test-2.py**usando um FileSystemLoader

from jinja2 import Environment, FileSystemLoader
env = Environment(loader=FileSystemLoader('.'))
# env = Environment(loader=FileSystemLoader('templates'))
tmpl = env.get_template('example.html.jinja')

print (tmpl.render(
    variable = 'Value with <unsafe> data',
    item_list = [1, 2, 3, 4, 5, 6]))

**jinja-test-2.py**usando um PackageLoader

from jinja2 import Environment, PackageLoader
env = Environment(loader=PackageLoader('main', 'templates'))
tmpl = env.get_template('example.html.jinja')

print (tmpl.render(
    variable = 'Value with <unsafe> data',
    item_list = [1, 2, 3, 4, 5, 6]))

Como Jinja usa o módulo, pkg_resourcesvocê deve adicionar um vazio main/__init__.pyse usar o PackageLoader. Ou você recebe uma exceção

"Can't perform this operation for unregistered loader type"

Agora, quando você define um ponto de interrupção no modelo e executa o aplicativo, o depurador para no modelo e você pode avançar com F10.

Certifique-se de que o tipo de idioma do arquivo de modelo esteja definido como Jinja. Caso contrário, você não pode definir pontos de interrupção.