Web 開発を行うには、テンプレート エンジンを扱う必要があります。次々とPythonのテンプレートエンジンに触れてきて、まとめられるようになった気がします。
1. まず、私の馴染みに従ってリストします:
pyTenjin: Doodle と 91 外国人教師を開発するときに使用します。
Tornado.template: Zhihu Daily の開発時に使用しました。
PyJade: Zhihu Daily を開発していたときにこれに出会いました。
マコ: 早期に終了した小さなプロジェクトでのみ使用しました。
Jinja2: まだデモをいくつかしただけです。
他には触れません。たとえば、Django のテンプレートは遅くて使いにくいと言われています。
2. パフォーマンスについて話しましょう
多くのテストは単なる大きなループか何かであり、非常に非技術的です。実際、テンプレートのレンダリング時間は主に、スプライシング、エンコード、エスケープなどの文字列処理に消費されますが、ループは Python ランタイムのパフォーマンスを測定します。
そこで、実際の例を使用してテストすることにし、最終的に Doodle のホームページを選択しました。これには、いくつかのサブテンプレート、いくつかのループ、いくつかの関数呼び出し、および多くの変数があり、非常に代表的です。 pyTenjin 以外のテンプレート エンジンはローカル キャッシュをサポートしていないことを考慮して、キャッシュを使用するサイドバーを削除し、メイン部分のみをレンダリングしました。
1000 回のレンダリングの結果は、pyTenjin は 0.65 秒、前処理をキャンセルした後は 0.9 秒、Tornado.template は 1.0 秒、Jinja2 は 1.1 秒かかりました。
テスト コードには数百行と 19 個のファイルがあるため、リストするのは面倒です。他のテンプレート エンジンはテストが遅すぎます。
@pyTenjin の利点、特に前処理のサポートは明らかです。この前処理の主な機能は、最初にいくつかの定数をコンパイルすることです。これにより、定数はレンダリング中に再度処理する必要がなくなります (文字列に変換されているため)。また、一部の関数は有効にするかどうかを静的に決定できます。前処理により不要なコードを削除できます。 関数コード (主に if 分岐) は事前に削除されます。さらに、コード セグメントのレンダリング結果はキャッシュできるため、一定期間再レンダリングする必要はありません。
@Jinja2 Tornado.template よりも遅いとは予想していませんでした。多くのテストと矛盾しているようです。
@Mako は Jinja2 に似ていると予想されます。コード スニペットのレンダリング結果をキャッシュすることもできます。
@PyJade は、キャッシュせずに Jade テンプレートを他のテンプレートに変換する必要があるため、かなり遅くなることが予想されます。
PyJade 以外は数倍の性能差は絶対にないので、使いやすいものを選んでください。
3.最後に使いやすさ
@pyTenjin の利点は、任意の Python コードを記述できることです。
欠点は、、、#{...}、#{{.. など、タグがより複雑で固有であることです。 .}}、{==...==}、{#==...==#}、${...}、${{...}}、{#=...=# } と {# ==...==#} 種類はたくさんありますが、見た目はとてもかわいいです。
< および > 記号を使用すると、HTML タグ内で使用すると、エディターが構文を解析できなくなります。
さらに、expr パラメータが 0 の場合、tagattr() メソッドはこれを True として扱います。これを修正するにはソース コードを変更する必要がありますが、プル リクエストを送信するためのオープン ソース プロジェクトがありません。
そして、開発者は 1 人しかおらず、1 年以上更新されておらず、明らかに十分な活動が行われていません。
@Tornado.template の利点は、Tornado との連携が良好で (結局のところ、Tornado が付属しています)、機能とパフォーマンスが問題ないことです。
欠点としては、エラー発生時に間違った書き込みを見つけにくいことと、他のテンプレートエンジンに比べて機能が少ないことです(それでも足りないという状況には遭遇したことはありません)。
また、{% raw ... %} は書くのが非常に面倒です。 None は出力時に空の文字列ではなく None と表示されるため、書くのが面倒になります。
出力される HTML コードでは先頭と末尾のスペースが削除されていますが、個々の Python コード行は空白行として表示され、奇妙に見えます。
@Jinja2 の利点は、多くの関数があり、構文糖であるフィルターやインライン if 式などの多くの補助関数が定義されているため、より快適に記述できることです。さらに、空白を調整して、出力する HTML の見栄えを良くすることもできます。
欠点は、学習コストが高く、構文が純粋な Python ではないことです。Python モジュールをインポートしたり、[item for item in list if item] などのリスト解析式を使用したりすることもできません。
もう 1 つの重大な欠点は、非 ASCII 文字列を出力できないことです。この場合、Unicode 型を使用する必要がありますが、これを保証するのは非常に面倒です。
@Mako の利点は、pyTenjin と同様に任意の Python コードを記述でき、Jinja2 と同様にフィルターをサポートしていることです (実際、関数呼び出しに慣れている場合)。
欠点は、学習コストが高く、構文が複雑で、HTML エディターにとって使いにくいことです。
@PyJade の利点は、(特にフロントエンドの場合) 書くのが最も速く、余分なものが何もないことです。
欠点は Jinja2 と同じで、さらに悪いことに、ドキュメントがほとんどなく、最新のリリース バージョンが入手できないため、開発バージョンを使用する必要があります。
今のところ、私は pyTenjin を使い続けることになりそうです。その他は使いにくいか、学習コストが比較的高く、追加の機能は必要ありません。