我想构建一个收集Jinja2模板覆盖范围的工具,为此我需要将生成的字节码映射到源HTML文件。
我在Template
类get_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_lineno
,block
就会开始工作:
{% block content %}
<body>
{% if 2 + 2 == 4 %}
<p>This looks ok</p>
{% else %}
<p>This is not good</p>
{% endif %}
</body>
{% endblock %}