Jinja2模板get_corresponding_lineno不起作用

时间:2016-05-04 15:28:50

标签: python jinja2 template-engine

我想构建一个收集Jinja2模板覆盖范围的工具,为此我需要将生成的字节码映射到源HTML文件。

我在Templateget_corresponding_lineno中找到了一个方法,看起来它应该可以完成工作,但事实并非如此。

这是我的代码示例。它包含模板文件夹中的主脚本main.py和模板文件,该文件夹位于main.py

文件夹中
# main.py
import os
import jinja2

TEMPLATE_FILENAME = 'index.html'
TEMPLATE_DIR = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'templates')

env = jinja2.Environment(loader=jinja2.FileSystemLoader(TEMPLATE_DIR))

template = env.get_template(TEMPLATE_FILENAME)
text = template.render()
lineno =template.get_corresponding_lineno(1)

模板index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
{% if 2 + 2 == 4 %}
    <p>This looks ok</p>
{% else %}
    <p>This is not good</p>
{% endif %}
</body>
</html>

当我运行main.py时,我得到以下异常:

Traceback (most recent call last):
File "/Users/nikolaygolub/workspace/my/coverage-jinja-plugin/example/run.py", line 15, in <module>
  print(template.get_corresponding_lineno(8))
File "/Users/nikolaygolub/workspace/pyenvs/py3all/lib/python3.5/site-packages/jinja2/environment.py", line 1056, in get_corresponding_lineno
  for template_line, code_line in reversed(self.debug_info):
File "/Users/nikolaygolub/workspace/pyenvs/py3all/lib/python3.5/site-packages/jinja2/environment.py", line 1072, in debug_info
  self._debug_info.split('&')]
File "/Users/nikolaygolub/workspace/pyenvs/py3all/lib/python3.5/site-packages/jinja2/environment.py", line 1071, in <listcomp>
  return [tuple(imap(int, x.split('='))) for x in
ValueError: invalid literal for int() with base 10: ''

我已经探索了一下模板对象,发现_debug_info属性只是空字符串。

我怎么解决这个问题?

我的环境是Python 3.5,Mac OS X,Jinja2 2.8

类似的问题:Jinja, get line of source code after template rendering

UPD 我取得了进步。如果我向源添加get_corresponding_linenoblock就会开始工作:

{% block content %}
<body>
{% if 2 + 2 == 4 %}
    <p>This looks ok</p>
{% else %}
    <p>This is not good</p>
{% endif %}
</body>
{% endblock %} 

0 个答案:

没有答案