Débogage des modèles Jinja2 dans VSCode

Aug 21 2020

J'ai donc trouvé l' "jinja: "true"option pour launch.json et j'essaie de faire fonctionner le débogage jinja, sans succès jusqu'à présent.

Mon launch.json est actuellement :

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

J'ai rencontré un problème que je ne pouvais pas configurer de points d'arrêt dans le fichier de modèle jinja, mais je l'ai résolu en ajoutant "debug.allowBreakpointsEverywhere": truedes paramètres vscode.

Mes questions sont les suivantes :
a) Comment le modèle de débogage est-il censé fonctionner ? J'ajoute un point d'arrêt n'importe où dans le modèle et l'exécution s'arrête là ? Ou peut-être que cela 'jinja': truesignifie quelque chose de complètement différent ?
b) Sur la base de la réponse en a), si les points d'arrêt dans le fichier de modèle jinja devraient fonctionner, comment y parvenir, car ils semblent actuellement être simplement ignorés ?

Merci beaucoup!

Réponses

2 rioV8 Aug 26 2020 at 19:40

J'ai d'abord essayé l'exemple sur la page 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>

Assurez-vous que le type de langue du fichier de modèle est défini sur Jinja. Sinon, vous ne pouvez pas définir de points d'arrêt.

Étant donné que le fichier a été lu dans une chaîne avant d'être transmis à la classe Jinja Template, il n'y avait aucun lien vers le point d'arrêt défini sur le modèle.

En lisant le code source de jinja2.Templatej'ai trouvé que la manière préférée de créer un jinja2.Templateest via l' jinja2.Environmentinstance.

Après une recherche, j'ai trouvé un autre exemple d'utilisation de Jinja sur SO en utilisant le jinja2.Environmenta Loader .

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

Parce que Jinja utilise le module pkg_resources, vous devez ajouter un vide main/__init__.pysi vous utilisez le PackageLoader. Ou vous obtenez une exception

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

Lorsque vous définissez maintenant un point d'arrêt dans le modèle et exécutez l'application, le débogueur s'arrête dans le modèle et vous pouvez avancer avec F10.

Assurez-vous que le type de langue du fichier de modèle est défini sur Jinja. Sinon, vous ne pouvez pas définir de points d'arrêt.