Debugowanie szablonów Jinja2 w VSCode

Aug 21 2020

Znalazłem więc "jinja: "true"opcję launch.json i próbuję sprawić, by debugowanie jinja działało, jak dotąd bezskutecznie.

Mój plik launch.json to obecnie:

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

"debug.allowBreakpointsEverywhere": trueNapotkałem problem polegający na tym, że nie mogłem ustawić punktów przerwania w pliku szablonu jinja, ale rozwiązałem go, dodając do ustawień vscode.

Moje pytania są następujące:
a) Jak ma działać szablon debugowania? Dodam punkt przerwania w dowolnym miejscu szablonu i tam kończy się wykonywanie? A może to 'jinja': trueoznacza coś zupełnie innego?
b) Na podstawie odpowiedzi a), jeśli punkty przerwania w pliku szablonu jinja powinny działać, jak to zrobić, ponieważ obecnie wydaje się, że są po prostu ignorowane?

Wielkie dzięki!

Odpowiedzi

2 rioV8 Aug 26 2020 at 19:40

Najpierw wypróbowałem przykład na stronie Wikipedii 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>

Upewnij się, że typ języka pliku szablonu jest ustawiony na Jinja. W przeciwnym razie nie możesz ustawić punktów przerwania.

Ponieważ plik został odczytany jako łańcuch przed przekazaniem go do klasy szablonu Jinja, nie było łącza do punktu przerwania ustawionego w szablonie.

Czytając kod źródłowy jinja2.Templatestwierdziłem, że preferowanym sposobem tworzenia pliku jinja2.Templatejest jinja2.Environmentinstancja.

Po wyszukiwaniu znalazłem inny przykład użycia Jinja na SO przy użyciu jinja2.Environmenta Loadera .

**jinja-test-2.py** przy użyciu 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** przy użyciu 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]))

Ponieważ Jinja używa modułu pkg_resources, musisz dodać pusty, main/__init__.pyjeśli używasz PackageLoader. Lub otrzymasz wyjątek

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

Po ustawieniu punktu przerwania w szablonie i uruchomieniu aplikacji debuger zatrzymuje się w szablonie i można przejść dalej za pomocą klawisza F10.

Upewnij się, że typ języka pliku szablonu jest ustawiony na Jinja. W przeciwnym razie nie możesz ustawić punktów przerwania.