2012-08-08 9 views
52

レンダリングするjinja2テンプレート(.htmlファイル)があります(my pyファイルの値でトークンを置き換えてください)。しかし、レンダリングされた結果をブラウザに送るのではなく、新しい.htmlファイルに書きたいと思います。私は、ソリューションはまた、ジャンゴのテンプレートのために似ていると思います。jinja2の出力をブラウザではなくPythonでレンダリングするには

どうすればいいですか?

+0

一部のフレームワークでスタンドアロンでjinja2を使用していますか? – sberry

答えて

88

どうやってこのようなことができますか?

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", "wb") as fh: 
    fh.write(output_from_parsed_template) 

test.htmlという

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

出力

<h1>Hello World!</h1> 

あなたがそのようなフラスコのようなフレームワークを使用している場合は、あなたの一番下にこれを行うことができますあなたが戻ってくる前に、見る。

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 
+1

非常に良いanwser :-) – aychedee

+0

迅速な対応をありがとうございます。 私が正しく理解していた場合、あなたの最初のsnippitへ:Jinja2のインポート環境から 、FileSystemLoader ENV =環境(ローダー= FileSystemLoader( 'テンプレート')) テンプレート= env.get_template( 'test.htmlという') output_from_parsed_template = template.render(foo = 'Hello World!') print output_from_parsed_template 私はある種類のファイル書き込み行で印刷行を置き換えることができました。あれは正しいですか?そのような行をファイルに書き込むとどうなるでしょうか? Re。フラスコ、これは大きなアプリの小さな部分なので、私はフレームワークを使用できるかどうかわかりません。 –

+0

@BillG:上記の編集を参照してください。 – sberry

3

テンプレートをロードした後、レンダリングを呼び出して出力をファイルに書き込みます。 '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) 
+0

これは、次のようになります: 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)) オープン( 'my_new_html_file.html'、 'W')とf: f.write(response.content) ここで、template_valuesはすでに入力されています。 必要に応じて修正してください。ありがとう。 –

+0

ハングアップ、少し私の答えを編集させてください... – aychedee

+0

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

0

答え、私は(f.closeを追加する必要がありました)。そうしないと、ディレクトリ内にファイルが見つからないことがあります。

関連する問題