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


85

我有一个要渲染的jinja2模板(.html文件)(用py文件中的值替换标记)。但是,我没有将呈现的结果发送到浏览器,而是将其写入新的.html文件。我想对于Django模板,解决方案也将类似。

我怎样才能做到这一点?

Answers:


129

这样的事情怎么样?

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

感谢您的迅速答复。如果我理解正确,那么到您的第一个片段:从jinja2导入环境中,FileSystemLoader env = Environment(loader = FileSystemLoader('templates'))template = env.get_template('test.html')output_from_parsed_template = template.render(foo ='Hello World!')打印output_from_parsed_template我可以用某种文件写入行替换打印行。那是对的吗?这样写到文件的行可能是什么样的?回覆。Flask,这只是大型应用程序的一小部分,所以我不知道我是否能够使用框架。
Bill G.

感谢您的澄清。我终于有机会尝试一下。最初,我收到一个错误“没有这样的文件或目录:'my_new_file.html'”。显然文件已经存在。然后,我复制了模板文件,并将其重命名为“ my_new_file.html”。现在我得到一个错误:IOError:文件无法打开以进行写入。可能是因为我正在使用Google App Engine开发吗?
Bill G.

@BillG。不,这是我的错误。尝试上述更改:更改rbwb
sberry

感谢您及时的回复。我将rb更改为wb,现在出现以下错误:IOError:无效模式:wb
BillG。

)底部代码部分中第一行的末尾缺少内容。我试图添加它,但SO需要修改为> 6个字符(笨限制)..
埃格兰


8

因此,在加载模板之后,您可以调用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))模板= jinja_environment.get_template('CommentCreate.html')self.response.out.write(template.render(template_values))与open('my_new_html_file.html','w')为f:f.write(response.content)在template_values已填充的位置。请根据需要进行更正。谢谢。
Bill G.

感谢您的澄清。我终于有机会尝试一下。最初,我收到一个错误“没有这样的文件或目录:'my_new_file.html'”。显然文件已经存在。然后,我复制了模板文件,并将其重命名为“ my_new_file.html”。现在我得到一个错误:IOError:文件无法打开以进行写入。可能是因为我正在使用Google App Engine开发吗?
Bill G.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.