如何将 jinja2 输出渲染到 Python 文件而不是浏览器中?

108
我有一个jinja2模板(.html文件),我想要渲染(将标记替换为我的.py文件中的值)。然而,我不想将渲染结果发送到浏览器,相反,我想将其写入一个新的.html文件。我想像解决方案也适用于Django模板。
我该怎么做?
3个回答

164

这样怎么样?

from jinja2 import Environment, FileSystemLoader
env = Environment(loader=FileSystemLoader('templates'))
template = env.get_template('test.html')
output_from_parsed_template = template.render(foo='Hello World!')
print(output_from_parsed_template)

# to save the results
with open("my_new_file.html", "w") as fh:
    fh.write(output_from_parsed_template)

test.html

<h1>{{ foo }}</h1>

输出

<h1>Hello World!</h1>

如果您正在使用框架,比如Flask,那么您可以在视图底部进行此操作,在返回之前。

output_from_parsed_template = render_template('test.html', foo="Hello World!")
with open("some_new_file.html", "wb") as f:
    f.write(output_from_parsed_template)
return output_from_parsed_template

感谢您的迅速回复。 如果我理解正确,那么对于您的第一个片段: from jinja2 import Environment, FileSystemLoader env = Environment(loader=FileSystemLoader('templates')) template = env.get_template('test.html') output_from_parsed_template = template.render(foo='Hello World!') print output_from_parsed_template我可以将print行替换为某种文件写入行。是这样吗?这样写入文件的代码会是什么样子?关于Flask,这只是一个更大应用程序的一小部分,所以我不知道是否能够使用框架。 - Bill G.
谢谢你的澄清。我终于有机会尝试这个了。起初我遇到了一个错误,“没有这样的文件或目录:'my_new_file.html'”。显然,文件必须已经存在。然后我复制了模板文件并将其重命名为“my_new_file.html”。现在我得到了一个错误:IOError:文件未打开以进行写入。这可能是因为我在Google App Engine中开发造成的吗? - Bill G.
@BillG。不,那是我的错误。请尝试上面的更改:将“rb”更改为“wb”。 - sberry
感谢您的快速回复。我将rb更改为wb,现在出现以下错误:IOError: invalid mode: wb。 - Bill G.
底部代码段第一行末尾缺少一个 )。 我试图添加它,但是SO要求编辑的字符数>6(愚蠢的限制)... - egeland
@egeland 哦,确实有。已经修复了。感谢您指出这个问题。它已经存在了2.5年了! :-) - sberry

65

11

当您加载模板后,调用render并将输出写入文件。 'with'语句是上下文管理器。在缩进内部,您有一个名为'f'的打开文件对象。

template = jinja_environment.get_template('CommentCreate.html')     
output = template.render(template_values)) 

with open('my_new_html_file.html', 'w') as f:
    f.write(output)

那么,这看起来会像这样: TEMPLATE_DIR = os.path.join(os.path.dirname(file), 'templates') jinja_environment =
jinja2.Environment(autoescape=False, loader=jinja2.FileSystemLoader(TEMPLATE_DIR)) template = jinja_environment.get_template('CommentCreate.html') self.response.out.write(template.render(template_values))with open('my_new_html_file.html', 'w') as f: f.write(response.content)其中template_values已经被填充。如有需要请进行更正。谢谢。
- Bill G.
感谢澄清。我终于有机会试一下了。起初我遇到了一个错误:“没有这样的文件或目录:'my_new_file.html'”。显然,文件必须已经存在。然后我复制了模板文件并将其重命名为“my_new_file.html”。现在我又遇到了一个错误:IOError:文件未打开以进行写入。这可能是因为我正在Google App Engine中开发吗? - Bill G.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接