我正在使用 python
和 jinja2
使用模板从相同数据生成自定义报告(例如:能够导出到 xml
、json
、txt
或自定义结构,无需更改 python 脚本的任何行)。
我希望用户仅修改模板文件来配置其报告,因此使用变量来定义文件名和其他参数。
示例模板:
{# HEADER -#}
{% set filename = 'custom-report.txt' -%}
{# BODY -#}
{% for item in items -%}
Date = {{ item["Date"] }}
Action = {{ item["Action"] }}
Result = {{ item["Result"] }}
{% endfor %}
是否可以从 python 检索文件名值(在本例中为“custom-report.txt
”),以便我知道要使用的文件名是什么?
感谢您的帮助!
编辑:
为了更好地理解,下面是我对 python 的期望的示例:
template = templateEnv.get_template(template_path)
rawoutput = template.render(items=items)
output_filename = template.getVariable('filename')
with open(output_filename, "w") as stream:
stream.write(rawoutput)
“getVariable”方法就是我想要获取的。
最佳答案
更新
您可以像在模板中返回项目
一样执行此操作。在您的上下文中,只需添加一个变量 filename = 'custom-report.txt' # 或您需要的任何内容
,然后在渲染中您只需使用 {{ filename }}
来显示它.
使用 jinja2
包的简单示例
import jinja2
t = jinja2.Template("This is the filename: {{ filename }}!")
print t.render(filename ="custom-report.txt")
模板也可以是您的文件。
所以你需要 python 从模板中读取变量。如果没有框架(即具有请求对象来传递值的 flask
),这是无法完成的。我建议的一个解决方案是在 python 中读取模板并解析它以找到您需要的文本。 IE。
上面的模板按原样给出
template = templateEnv.get_template(template_path)
rawoutput = template.render(items=items)
output_filename = open('a.txt', 'r').read().split('{% set filename = \'')[1].split('\'')[0]
print(output_filename)
with open(output_filename, "w") as stream:
stream.write(rawoutput)
这样您就可以解析整个模板并拆分文件名。这不是最好的方法,但如果您保持标准格式,则可以使用。
关于python - 从 python3 检索 jinja2 模板变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57623322/