【问题标题】:Retrieve jinja2 template variables from python3从 python3 中检索 jinja2 模板变量
【发布时间】:2019-08-23 09:23:04
【问题描述】:

我正在使用 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”方法是我想要得到的。

【问题讨论】:

    标签: python python-3.x jinja2


    【解决方案1】:

    更新

    你会这样做,同样你在你的模板中返回你的items。在您的上下文中,只需添加一个变量 filename = 'custom-report.txt' # or whatever you need 并在渲染中使用 {{ 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 中解析模板并检索其中包含的一些变量,以便我可以调整将遵循渲染的操作。
    • 我还用一个例子更新了我的第一篇文章,这样你就可以更好地理解我想要做什么。 python脚本不知道文件名“custom-report.txt”!
    • @SébastienMatton 看看上面。
    • 谢谢。如果没有更优雅的解决方案,这确实是我的工作方式......但我仍然在祈祷,希望有一个不会受到额外空格、单引号或双引号影响的真正解决方案。 .. :-)
    • 如果没有客户端-服务器框架传递变量,这是无法完成的,因为 python 会使用自己的数据呈现文件,但反过来无法完成。希望我有所帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-27
    • 1970-01-01
    • 2016-10-30
    • 2015-12-08
    • 2021-04-22
    • 2012-11-25
    相关资源
    最近更新 更多