ブラウザではなくPythonでjinja2出力をファイルにレンダリングするにはどうすればよいですか?


87

レンダリングしたいjinja2テンプレート(.htmlファイル)があります(トークンをpyファイルの値に置き換えます)。ただし、レンダリングされた結果をブラウザーに送信する代わりに、新しい.htmlファイルに書き込みたいと思います。解決策はdjangoテンプレートでも同様だと思います。

これどうやってするの?

回答:


130

このようなものはどうですか?

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 import Environmentから、FileSystemLoader env = Environment(loader = FileSystemLoader( 'templates'))template = env.get_template( 'test.html')output_from_parsed_template = template.render(foo = 'Hello World!')printoutput_from_parsed_template印刷行をある種のファイル書き込み行に置き換えることができます。あれは正しいですか?ファイルに書き込むそのような行はどのように見えるでしょうか?再。Flask、これは大きなアプリのごく一部なので、フレームワークを使用できるかどうかはわかりません。
ビルG.

説明をありがとう。私はついにこれを試す機会がありました。最初に、「そのようなファイルまたはディレクトリはありません: 'my_new_file.html'」というエラーが発生しました。どうやらファイルはすでに存在している必要があります。次に、テンプレートファイルをコピーして、名前を「my_new_file.html」に変更しました。エラーが発生しました:IOError:ファイルを書き込み用に開いていません。これは、Google App Engineで開発しているためでしょうか?
ビルG.

@BillG。いいえ、それは私の側のエラーでした。上記の変更rbを試してください:に変更されましたwb
sberry 2012

迅速な対応に感謝致します。rbをwbに変更したところ、次のエラーが発生しました。IOError:無効なモード:wb
Bill G.

)下部のコードセクションの最初の行の終わりに欠落があります。私はそれを追加しようとしていたが、SOは...> 6つの文字(愚かな制限)する編集を要求する
egeland


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))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はすでに入力されています。必要に応じて修正してください。ありがとう。
ビルG.

説明をありがとう。私はついにこれを試す機会がありました。最初に、「そのようなファイルまたはディレクトリはありません: 'my_new_file.html'」というエラーが発生しました。どうやらファイルはすでに存在している必要があります。次に、テンプレートファイルをコピーして、名前を「my_new_file.html」に変更しました。エラーが発生しました:IOError:ファイルを書き込み用に開いていません。これは、Google App Engineで開発しているためでしょうか?
ビルG.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.