Debug dei modelli Jinja2 in VSCode

Aug 21 2020

Quindi ho trovato l' "jinja: "true"opzione per launch.json e sto cercando di far funzionare il debug di jinja, finora senza successo.

Il mio launch.json è attualmente:

{
    "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
        }
    ] }

Ho riscontrato un problema che non riuscivo a impostare punti di interruzione nel file modello jinja, ma l'ho risolto aggiungendo "debug.allowBreakpointsEverywhere": truealle impostazioni vscode.

Le mie domande sono le seguenti:
a) Come dovrebbe funzionare il modello di debug? Aggiungo un punto di interruzione in qualsiasi punto del modello e l'esecuzione si interrompe lì? O forse questo 'jinja': truesignifica qualcosa di completamente diverso?
b) Sulla base della risposta su a), se i punti di interruzione nel file modello jinja dovessero funzionare, come fare in modo che ciò accada, poiché attualmente sembrano essere semplicemente ignorati?

Molte grazie!

Risposte

2 rioV8 Aug 26 2020 at 19:40

Per prima cosa ho provato l'esempio sulla pagina Wikipedia di 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>

Assicurati che il tipo di lingua del file modello sia impostato su Jinja. Altrimenti non puoi impostare punti di interruzione.

Poiché il file è stato letto in una stringa prima di essere assegnato alla classe Jinja Template, non vi era alcun collegamento al punto di interruzione impostato sul modello.

Leggendo il codice sorgente di jinja2.Templateho scoperto che il modo preferito per creare a jinja2.Templateè attraverso l' jinja2.Environmentistanza.

Dopo una ricerca ho trovato un altro esempio di utilizzo di Jinja su SO utilizzando jinja2.Environmenta Loader .

**jinja-test-2.py**utilizzando un 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**utilizzando un 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]))

Poiché Jinja utilizza il modulo pkg_resources, è necessario aggiungere un vuoto main/__init__.pyse si utilizza PackageLoader. Oppure ottieni un'eccezione

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

Quando ora imposti un punto di interruzione nel modello ed esegui l'applicazione, il debugger si interrompe nel modello ed è possibile procedere con F10.

Assicurati che il tipo di lingua del file modello sia impostato su Jinja. Altrimenti non puoi impostare punti di interruzione.