从python3检索jinja2模板变量

从python3检索jinja2模板变量,python,python-3.x,jinja2,Python,Python 3.x,Jinja2,我正在使用python和jinja2使用模板从相同的数据生成定制的报告(例如:能够导出到xml、json、txt或定制结构,而无需更改python脚本的任何行) 我希望用户只修改模板文件以配置其报告,因此使用变量来定义文件名和其他参数 模板示例: {# HEADER -#} {% set filename = 'custom-report.txt' -%} {# BODY -#} {% for item in items -%} Date = {{ item["Date"] }} Action

我正在使用
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\u模板(模板路径)
rawoutput=template.render(项目=项目)
output\u filename=template.getVariable('filename'))
以open(output_文件名,“w”)作为流:
stream.write(输出)
其中“getVariable”方法是我想要得到的。

UPDATE 同样,如果您在模板中返回了
,也可以这样做。在您的上下文中,只需添加一个变量
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阅读模板并对其进行解析,以找到所需的文本。即 使用上述模板按原样提供

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解析模板并检索其中包含的一些变量,这样我就可以调整呈现之后的操作。我还用一个示例更新了我的第一篇文章,这样你就可以更好地理解我要做的事情。python脚本不知道文件名“custom report.txt”@塞巴斯蒂安·马顿,看看上面。谢谢。如果没有更优雅的解决方案,这确实是我的工作方式……但我仍在交叉手指,希望有一个真正的解决方案不会受到额外空格、简单或双引号的影响,…-)如果没有客户机-服务器框架,则无法传递变量,因为python使用自己的数据呈现文件,但无法实现相反的操作。希望我能帮忙。