よくある質問¶
なぜ Jinja と名付けたのか? ¶
"Jinja" は日本の神社または寺院であり、寺院とテンプレートは英語の発音に似ています。ウガンダのジンジャという街にちなんで名付けられたわけではありません。
Jinja はどれくらい速いですか? ¶
Jinja はテンプレートエンジンの中では比較的高速です。テンプレートコードを Python コードにコンパイルしてキャッシュするため、テンプレートは毎回解析して解釈する必要がありません。テンプレートのレンダリングは Python 関数の実行にできるだけ近づきます。
Jinja はキャッシュを大いに活用しています。テンプレートはロード後に名前でキャッシュされるため、将来のテンプレートの使用はロードを回避できます。テンプレートのロード自体では、繰り返しコンパイルを避けるためにバイトコードキャッシュを使用します。キャッシュは外部で保持して再起動時に失われないようにできます。また、テンプレートを事前コンパイルして高速な Python インポートとしてロードすることもできます。
ベンチマークは実際の使用状況を反映していないので、嫌いです。パフォーマンスは多くの要因によって異なります。さまざまなエンジンにはそれぞれ異なる既定の設定とトレードオフがあり、便利な比較を設定する方法が明確ではありません。多くの場合、データベースアクセス、API 呼び出し、データ処理はテンプレートエンジンよりもパフォーマンスに大きな影響を与えます。
テンプレートにロジックを入れるのはまずいことではありませんか? ¶
string.Template
という、Python に同梱されている、レンダリング前にコードで処理を行うテンプレート エンジンがあります。これは非常に高速ですが便利ではありません。
ブロック、ステートメント、フィルタ、関数呼び出しなどの Jinja の機能を使用すると、非常に少ない制限で表現力豊かなテンプレートを簡単に書くことができます。Jinja ではテンプレートに任意の Python コードや Python 言語で利用可能なすべての機能を使用することはできません。これにより、エンジンは保守が容易になり、テンプレートは読みやすくなります。
誰もが満足できるようにするには、テンプレートで多少のロジックが必要です。テンプレートにロジックが多すぎると、推論や保守が複雑になる可能性があります。アプリケーションの仕組みを決定し、テンプレートに入れるロジックの量をバランスさせるのはあなた次第です。
HTML エスケープをデフォルトにしないのはなぜですか? ¶
Jinja には、レンダリングされたテンプレート内の HTML 構文をエスケープする機能があります。ただし、デフォルトでは無効になっています。
Jinja は汎用のテンプレートエンジンであり、HTML ドキュメントに限定されません。プレーンテキスト、LaTeX、電子メール、CSS、JavaScript、設定ファイルなどを生成できます。これらのドキュメント タイプには HTML エスケープは意味がありません。
自動エスケープは XSS の問題が発生しにくい一方、コンパイルとレンダリング時に大幅な追加処理が必要で、パフォーマンスの低下につながる可能性があります。Jinja は、エスケープ用に MarkupSafe を使用します。これは高速化のために最適化された C コードを提供しますが、メソッドとフォーマット間でエスケープを追跡するためにオーバーヘッドが発生します。