33

イントロ

私は現在、非常に標準的なDjangoベースのアプリ(基本的には派手なCRM /連絡先リストのようなもの)を書いています。これは一種の機能ですが、(jQueryを使用して)ますます多くのAJAXy UIコードを使用してインターフェイスを改善しようとすると、作業が非常に困難になり始めています。DOMを解析し、変更をサーバーにプッシュして戻し、JSONを取得し、それに基づいてDOMを更新しようとする、壊れやすいjQueryイベントハンドラーの長いブロックを取得しています。

少なくとも、クライアント側のテンプレートをいくつかミックスに追加したいと思います。または、JSフレームワークに切り替えて、Djangoアプリをデータベース抽象化レイヤーとして使用することもできます。または、Pythonを知っていて大好きですが、Djangoアプリを放棄して、JS/Node.jsソリューションなどを試してみることができます。

他の誰かがこの状況にありましたか?どのようにそれを解決しましたか?

設計目標

  1. DRY:モデルやテンプレートを複製する必要はありません(少なくとも、必要以上に複製する必要はありません)。
  2. ページにアクセスした訪問者に、サーバー側でレンダリングされた結果を取得してもらいたい。
  3. 訪問者が物事をクリックすると、クライアント側のテンプレートとレンダリングを介してそれを処理し、RESTインターフェイスへのAJAX呼び出しを介してサーバーを最新の状態に保ちたいと思います。

だから...どうすればこれを行うことができますか?いくつかのフレームワークとテンプレートシステムへのリンクを集めました。順不同:

dust.js

これは、LinkedInが同様の問題を解決するために使用しているようです。サーバー側でNode.jsを使用しますが、これは理想的ではありません(Nodeを使用したことはありません)が、少なくともJVMベースではありません。また、githubでは休止しているようです-メンテナがどこに行ったのか疑問に思っているメーリングリストを見つけました。それはかなり良いように聞こえます-LinkedInからのブログ投稿は、テクノロジー、特にそれをコンパイルする機能を売るのに良い仕事をしています。しかし、それはただテンプレートを作成しているように見えます。私が欲しいものにはそれで十分ですか?

口ひげ

このオプションにはPythonとJSの両方の実装があり、人気があるようです...しかし、DjangoでMustacheテンプレートを使用しているように見える人は見つかりません。それは、ブログ投稿に値するのは簡単すぎるからですか、それとも不可能であるか、そうでなければお勧めできませんか?また、かなり制限されています。少なくとも、ある種のMVCJSフレームワークに目を向ける必要があるでしょう。

バックボーン、スパイン、KnockoutJS、EmberJS、JavascriptMVCなど:

非常に多くのフレームワークがあり、それは一種の気が遠くなるようなものです。それらのすべては一見完全に良いように見えます。また、このルートに行った場合、アプリの多くを書き直す必要があるようです。実際にこのようなことをすでに行っている人を本当に見つけたいと思います。また、Djangoから来た人を背景として明確な選択肢があればいいのにと思います。それらを評価するために、半ダースの異なるフレームワークを学ぶ必要はありません。

DerbyJS

これは、クライアント側とサーバー側の両方を1つのパッケージで処理するため、面白そうに見えますが、少し未成熟です。彼らは本番環境でそれを使用することに対して警告します、そして私がドキュメントを理解するならば、それはまだどんな形の永続性もサポートしていません、それは...制限しています。完成すれば自分の欲しいものにピッタリな気がしますが…

それで....

だから、ええと...今何?誰かがこれらのツールのいずれかを使用して、クライアント側のレンダリングをDjango Webアプリに追加しようとしたことがありますか?どうだった?

4

4 に答える 4

6

Django テンプレートとの完全な統合のために、私はこれを見つけました: Yz-Javascript-Django-Template-Compiler。私はそれを自分で使用したことはありません。残念ながら、少しメンテナンスされていないように見えます。

Swigは、高速な JS django に似たテンプレート エンジンです。

Pureはコンパイル済みの JS テンプレート ツールです。テンプレートは通常の有効な HTML にすぎないため、少し考えれば Django とうまく連携できます。

その他の興味深い JS テンプレート ライブラリ:

于 2011-12-15T15:08:27.787 に答える
4

言及されているすべてのフレームワークは、クライアント側でのみ機能します。それはさておき、彼らはあなたが直面しているパズルのピースであるため、一見の価値があります.

あなたの設計目標は、まさに私が現在のプロジェクトで達成しようとしているものです。私が現在やろうとしていることは次のとおりです。

クライアント側

Backbone + の使用 (ここではいくつかのテンプレート エンジン)

サーバ側

html の最初のセットをレンダリングし、Backbone が取得して操作できる JSON データをレンダリングします (たとえば、読み込まれた現在のページ、最大ページ数など)。

クライアントの読み込み: http://mysite.com/blog/archive/5

サーバーのレンダリング:

<html>
    <head>
        <script>
            var data = {
                page:5 // Rendered by Server,
                maxPages: 10
            };

            $(function(){
                // Hook up all Backbone stuff, and hook into interaction events
            });
        </script>
    </head>
    <body>
        <!-- Content -->
    </body>
</html>

これにより、設計ポイント 2 と 3 が解決されます。サーバーは Web アプリケーションの初期状態をロードし、ユーザーはそこからクライアント側をナビゲートできます。

設計ポイント 1: クライアント側では、すべて問題ありません。ただし、サーバー側では、テンプレートをそのままレンダリングするための js エンジンが必要です。LinkedIn の記事では、次のように言及されています。

  • サーバー側のサポート:検索エンジン クローラーなど、JavaScript を実行できないクライアントがある場合、ページはサーバー側でレンダリングする必要があります。記述された同じ Dust.js テンプレートは、ブラウザーだけでなく、node.jsまたはRhinoを使用してサーバーでもレンダリングできます。

だからあなたは2つのオプションで立ち往生しています:

  • node.js または Rhino でテンプレート エンジンを使用する、または
  • 他の技術スタックでサポートされているテンプレート エンジンを見つけてください。

おかしなことに、上記の投稿のおかげで、ほとんどの一般的なスタックで使用できるライブラリを備えたMustacheがこのニーズを完全に満たしていることに気付きました。(Handlebars.js で使用できるライブラリがあるかどうかはわかりません) これにより、サーバー側とクライアント側の両方で Mustache.js テンプレートを作成し、どちらの側でも同じテンプレートで html をレンダリングできるようになります。

編集:「サーバー側」のソリューションは、選択した言語/スタックである必要はありません。たとえば、Dust.js を使用しているからといって、アプリケーション全体を Node.JS でコーディングする必要があります。代わりに、シェル コマンドを介してコンパイル スクリプトを実行することで取得できる場合があります。

編集: Mustache には「プリコンパイル」ソリューションがないように見えます。つまり、テンプレートをクライアント側のレンダリング用にページに直接レンダリングする必要があります (したがって、キャッシュはありません)。これは 100% 理想的ではありません。

于 2012-01-02T00:32:47.780 に答える
1

サーバー側とクライアント側の両方で Mustache を使用しましたが、うまく機能しました。私が使用したプロジェクトは小さなサイド プロジェクトでしたが、結果には本当に満足しており、お勧めします。

HTTP サービスをデバッグするための Web アプリであるこのプロジェクトは、GitHub にあります: Spyglassをご覧ください。

于 2011-12-15T05:05:11.883 に答える