Debug dei modelli Jinja2 in VSCode
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": true
alle 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': true
significa 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
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.Template
ho scoperto che il modo preferito per creare a jinja2.Template
è attraverso l' jinja2.Environment
istanza.
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__.py
se 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.