python - 从 python3 检索 jinja2 模板变量

标签 python python-3.x jinja2

我正在使用 pythonjinja2 使用模板从相同数据生成自定义报告(例如:能够导出到 xmljsontxt 或自定义结构,无需更改 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/

相关文章:

Python 元类 - 使类属性可通过类和类实例访问

python - 将请求文本响应加载到 Pandas 数据框中

python - 全局函数中的 Jinja2 框架变量

python - 使用 Flask 生成页面而不使用单独的模板文件

python - 如何在 Python 中像 ERB 一样进行模板化?

python - 如何将我的 Rest Api 服务器与我的 Web 套接字服务器通信

python - 从切片更新多列时 df.fillna() 不起作用

python - Pygame 不关闭

python - 实现 ABC 子类的正确方法

python - 如何在ThreadPool中延迟执行?