web-dev-qa-db-ja.com

ファイルシステムから直接jinjaテンプレートをロードする方法

pocoo.orgのjinja APIドキュメント 状態:

Jinja2を構成してアプリケーションのテンプレートをロードする最も簡単な方法は、おおよそ次のようになります。
from jinja2 import Environment, PackageLoader
env = Environment(loader=PackageLoader('yourapplication', 'templates'))
これにより、デフォルト設定とテンプレートをルックアップするローダーでテンプレート環境が作成されます テンプレート 内のフォルダー あなたの申請 pythonパッケージ。

結局のところ、これはそれほど簡単ではありません。テンプレートを使用してpythonパッケージを作成/インストールする必要があるためです。特に、コード。 here および here のトピックに関するSOの質問を参照できますが、答えはあいまいで不満です。

単純な初心者がやりたいことは、明らかに、パッケージ内のリソースとしてではなく、ファイルシステムから直接テンプレートをロードすることです。 これはどのように行われますか?

40
Juan Tomas

方法は次のとおりですFileSystemLoaderの代わりにPackageLoaderを使用します。ウェブ上で例を見つけました here および here 。テンプレートと同じディレクトリにpythonファイルがあるとしましょう:

./index.py
./template.html

このindex.pyはテンプレートを見つけてレンダリングします:

#!/usr/bin/python
import jinja2

templateLoader = jinja2.FileSystemLoader(searchpath="./")
templateEnv = jinja2.Environment(loader=templateLoader)
TEMPLATE_FILE = "template.html"
template = templateEnv.get_template(TEMPLATE_FILE)
outputText = template.render()  # this is where to put args to the template renderer

print(outputText)

結局、jinja2 APIドキュメントには すべての組み込みローダーについて説明するセクション があるため、すぐに気付かなかったのはちょっと恥ずかしいことです。しかし、導入部では、PackageLoaderがデフォルトの「最も簡単な」メソッドであるように表現されています。 Pythonの初心者にとって、これは野生のガチョウの追跡につながる可能性があります。

61
Juan Tomas

より簡単な方法は、 jinj2.Template コンストラクターを直接呼び出し、openを使用してファイルをロードすることです。

from jinja2 import Template
with open('template.html.jinja2') as file_:
    template = Template(file_.read())
template.render(name='John')
50
Cas

ライナーは次のとおりです。

template = Template(open('template_file.j2').read())

次に、テンプレートを別の行でレンダリングするか、すべてを1行でレンダリングできます。

rendered = Template(open('template_file.j2').read()).render(var="TEXT")
0
bcarroll