【问题标题】:Debugging Jinja2 templates in VSCode在 VSCode 中调试 Jinja2 模板
【发布时间】:2020-12-10 13:11:37
【问题描述】:

所以我找到了 launch.json 的 "jinja: "true" 选项,并试图让 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
        }
    ] }

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

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

非常感谢!

【问题讨论】:

  • 我搜索了源码,在ms-python扩展extensions/ms-python.python-2020.5.86806/pythonFiles/lib/python/old_ptvsd/ptvsd/_vendored/pydevd找到了一个jinja调试文件/pydevd_plugins/jinja2_debug.py 它谈到了 jinja-breakpoints 和 jinja-lines 但我不知道如何设置这些
  • 对于debugpy(在我启动python程序时使用)有一个类似的插件
  • 我为debugpy添加了一个问题:github.com/microsoft/debugpy/issues/381
  • 对该问题的最初评论是“只需设置选项,它就可以工作”。不适合我。所以我要求补充解释。

标签: python visual-studio-code jinja2


【解决方案1】:

首先我尝试了Jinja Wikipedia page上的示例

**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>

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

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

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

经过搜索,我找到了另一个Jinja usage example on SO using the jinja2.Environment a Loader

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

因为 Jinja 使用模块 pkg_resources,如果你使用 PackageLoader,你必须添加一个空的 main/__init__.py。或者你得到一个例外

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

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

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

【讨论】:

  • 就我而言,这里的关键是从将模板作为字符串加载并切换到将其作为环境的一部分加载——事后看来这是完全有道理的。对于任何想知道这些是在 VS Code 中更改文件语言的说明:code.visualstudio.com/docs/languages/…
猜你喜欢
  • 2011-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-01
  • 2022-01-12
  • 2021-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多