DjangoでCheetahテンプレートを使用する

かつてDjangoで使用するテンプレートエンジンを選択する必要がありました。 1つの組み込みソリューションにとどまるつもりはありませんでしたが、さまざまな製品のパフォーマンスと使いやすさについて少し調査しました。



現時点では、チーターを選択しました。 その理由は次のとおりです。





性能



優れたテンプレートエンジンを探して、「 マルチエンジンテンプレートシステム 」という記事を見つけました。この記事では、テンプレートのレンダリング速度をさまざまなエンジンと比較しました。

テストは、以下を含むかなり単純なテンプレートで実行されました。 Cheetah

明確なテストリーダーはチーターとマコです。 このテストおよび他のテストによると、CheetahはDjangoテンプレートエンジンより2倍以上高速です。 MakoはDjangoより1.7..2倍高速です。



チーターの場合、より複雑なテンプレートを使用してテストを実施しました。



基本テンプレートには、タイトル、スクリプト、コンテンツの3つのブロックが含まれていました。 ページテンプレートがそのテンプレートから継承され、これらのブロックが再定義されました。 タイトルでは、文字列がスクリプトに配置されました-100行のリストをクロールした結果、コンテンツ-100個のオブジェクトをクロールした結果、5つのプロパティの出力。 テンプレートを使用するページは100回呼び出されました。 最初の呼び出しの時間は考慮されませんでした。



その結果、平均ページ生成時間は次のようになりました。 チーターは再び2倍の速さです。



複雑なテンプレート(継承とオブジェクトのリスト)を使用してMakoをテストした結果を見るのは面白いでしょう。





構文



構文のせいで、私は間違いなくMakoとCheetahを選択しました。 ほとんどのテンプレートエンジンのタグのような構文は本当に嫌いです。 Cheetahは特定の文字を使用して、ディレクティブと変数の始まりを示します。 デフォルトでは、ディレクティブは#で始まり、変数は$で始まります。 この動作は、コンパイラディレクティブを使用してオーバーライドできます。



  #コンパイラー設定
 directiveStartToken = ^
 commentStartToken =#
 #endコンパイラ設定

 #テーブル行を印刷
 ^ def makerow(行、クラス)
     <tr class =” $ {class} _ggg”>
     ^ $行の$セルの場合:
         <td> $ cell </ td> ^丸lurみ
     ^終了
     </ tr>
 ^ end def 




汎用性



チーターとPythonには長い歴史があります(2001年以降)。 現時点では、Django、TurboGears、Pylonsなど、すべての主要なPython Webフレームワークでサポートされています...

フレームワークとは別に使用することもできます。





締め方



Cheetahテンプレートの使用に簡単に切り替えることができるdjango-cheetahtemplateプロジェクトがあります。 django_cheetahtemplatesを接続すると、 render_che_ah_responseメソッドが得られます。これはrender_to_responseの代わりに使用できます。 Django Templateクラスと同様に動作するCheetahTemplateクラスを接続することもできます。





問題はありますか?



Djangoは、複雑な正規表現を持つシャロンをノードに解析します。 テンプレートの適用は、転送されたコンテキストの各ノードのrender()メソッドの実行に限定されます。 Cheetahは各テンプレートをpythonクラスにコンパイルします。 これには時間がかかりますが、このテンプレートを使用するとパフォーマンスが向上するようです。 このようなアプローチは安全ではないと考えられています。テンプレートは、知らないはずのデータを参照する場合があります。 テンプレートを誤用すると、ドキュメントとそのプレゼンテーションの論理的な分離に違反する可能性があります。



100%の汎用性とデータとプレゼンテーションの厳密な分離が必要な場合は、XML-XSLTバンドルを使用することをお勧めします。 確かに、この場合、テンプレートの作成には特別な訓練を受けた人が必要になりますが、これは必ずしも便利ではありません。 そして、そのようなソリューションのパフォーマンスははるかに低くなります。



継承は、コンパイルされたテンプレートからのみ可能です。 ほとんどの場合、基本的なテンプレートは最初に記述され、コンパイルは1つのコマンド( cheetah compile template_name



)で行われ、数秒かかるため、これは問題ではありません。 さらに、近い将来、この操作を自動化するか、既成のソリューションを見つけようとします。





何を読む



Jinja2に関する重要な追加



ジンジャという言葉はコメントに11回登場しますが、ほとんどの場合、良い文脈で登場します。 もちろん、このような推奨事項を無視して、このテンプレートエンジンを配置することはできませんでした。 このコメントの言葉を読んでください。






All Articles