在 VSCode 中调试 Jinja2 模板

toi*_*bis 6 python jinja2 visual-studio-code

所以我找到了"jinja: "true"launch.json的选项,并试图让 jinja 调试工作,但到目前为止没有成功。

我的launch.json目前是:

{
    "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
        }
    ] }
Run Code Online (Sandbox Code Playgroud)

我遇到了一个问题,我无法在 jinja 模板文件中设置断点,但是将其添加"debug.allowBreakpointsEverywhere": true到 vscode 设置中解决了。

我的问题如下:
a) 调试模板应该如何工作?我在模板中的任意位置添加断点并在那里停止执行?或者这可能'jinja': true意味着完全不同的东西?
b) 基于对 a) 的响应,如果 jinja 模板文件中的断点应该起作用,如何实现这一点,因为目前它们似乎只是被忽略了?

非常感谢!

rio*_*oV8 5

首先我尝试了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]
)
Run Code Online (Sandbox Code Playgroud)

**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>
Run Code Online (Sandbox Code Playgroud)

确保模板文件的语言类型设置为Jinja. 否则无法设置断点。

由于文件在提供给 Jinja Template 类之前已读取为字符串,因此没有指向模板上设置的断点的链接。

阅读源代码jinja2.Template我发现创建 a 的首选方式jinja2.Template是通过jinja2.Environment实例。

经过搜索,我发现了另一个Jinja 使用示例,使用了jinja2.EnvironmentLoader

**jinja-test-2.py**使用文件系统加载器

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]))
Run Code Online (Sandbox Code Playgroud)

**jinja-test-2.py**使用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]))
Run Code Online (Sandbox Code Playgroud)

因为 Jinja 使用该模块,所以如果您使用 PackageLoader,pkg_resources则必须添加一个空模块。main/__init__.py或者你得到一个异常

"Can't perform this operation for unregistered loader type"
Run Code Online (Sandbox Code Playgroud)

现在,当您在模板中设置断点并运行应用程序时,调试器会在模板中停止,您可以使用 F10 单步执行。

确保模板文件的语言类型设置为Jinja. 否则无法设置断点。