7

ユーザーがフォームを送信し、国、期間、価格に基づいてフィルター処理された休日のリストを表示できる非常に単純な Django アプリがあります。

フロントエンドでバックボーンを使用して、JS が有効になっているユーザーが結果を表示するために GET する必要がなく、結果を動的にロードできるようにしたいと考えています。

プログレッシブ エンハンスメントを使用して、JS を使用するユーザーが Backbone エクスペリエンスを取得し、JS を使用しないユーザーが引き続きフォームを使用できるようにしたいと考えています。私もDRY 原則に従いたいと思っています。

私の質問は、これを行う最善の方法です。最小限の繰り返しで2つを一緒に使用する例はありますか? 私は特に次のことを考えています:

  1. URL のルーティング-国/期間/価格パラメーターを取得するために、/italy/1-week/from-500-to-1000/Django のルーターとバックボーンのルーターに 1 つずつ、2 セットのルーティング コードを記述する必要がありますか?urls.py
  2. パラメータに基づくデータのフィルタリングviews.py-バックボーンとバックボーンの 2 つの別々の方法でこれを行う必要がありますか? (少なくとも、両方の呼び出しに 1 つの API を使用できると思います。)
  3. テンプレートでのレンダリング- Django 用に 1 つのリスト テンプレートを作成し、Backbone 用に別のリスト テンプレートを作成する必要がありますか? それとも両方で同じテンプレートを使用できますか?

Backbone を Django に統合するためにこれまでに見つけた最良の (唯一の) 例は、Josh Bohde のDjango Backbone repoであり、これは段階的に強化されていません。

Backbone と Rails を使用したプログレッシブ エンハンスメントに関するこのブログ投稿も見つけましたが、Django で同様のものを見ると非常に役立ちます。

更新:同様のトピックでこのSOの質問を見つけました-答えが聞こえるほど状況は本当に絶望的ですか?

4

3 に答える 3

3

答えが聞こえるほど状況は本当に絶望的ですか?

かなり。しかし、以前は Django ベースでしたが、現在は Backbone ベースになっているサイトで作業しているので、いくつかの考えを提供できます。

/italy/1-week/from-500-to-1000/ のような URL のルーティング - 国/期間を取得するために、Django の urls.py に 1 つ、バックボーンのルーターに 1 つ、2 セットのルーティング コードを記述する必要がありますか? /価格パラメータ?

はい。ただし、重複を最小限に抑える方法はあります。私たちが取ったアプローチは、Django にすべての URL を JS 変数としてメインの HTML ページ テンプレートに出力させることでした。

<script>
URLS.report_error = "{% url app.log_client_error_view %}";
URLS.access_file = "{% url app.access_file_view 12345 %}";
</script>

これで、生成するすべての URL のパラメーターに 12345 を使用するパターンができました。これにより、基本的に に置き換えることができるため、その URL をバックボーン ルートの正規表現に簡単に変換し直すことができ12345ます([^/]+)

完全な開示のために、「手作業で」書かれたルート正規表現がたくさんありますが、これはそれらを自動化できなかったからではありません。Django 側から離れようとしているだけなので、そのコードをクリーンアップする理由はありません。両方のサポートについてハードコアになりたい場合は、非常に簡単でシンプルな翻訳スキームを考え出すことができるはずです。

パラメータに基づくデータのフィルタリング - これを行うには、views.py に 1 つ、Backbone に 1 つの 2 つの別々の方法を記述する必要がありますか? (少なくとも、両方の呼び出しに 1 つの API を使用できると思います。)

これは、Backbone/Django だけでなく、どのサイトでも基本的に避けられない問題です。クライアント側を信頼することできないため、サーバー側でデータをフィルタリングする必要があります (たとえば、ユーザーが JS を無効にする可能性があります)。同時に、サーバー側のみのフィルタリングは 1990 年代のものなので、クライアント側でもフィルタリングするためのロジックを作成 (複製) する必要があります (そうすれば、待機せずに「フィールド X を提供するのを忘れました」とユーザーに伝えることができます)。サーバーへの往復の場合)。

ただし、この重複を制限する方法があります。私自身はこの作業を行っていませんが、同僚が Django フォームを奇妙な方法で使用していたことを知っています (彼は Django が提供するフォームを使用し、それらをバックボーン ビューのテンプレートとして使用する前に少し解析しました)。これで重複が完全になくなるわけではなく、残念ながら詳細を思い出せませんが、役に立ちました。

テンプレートでのレンダリング - Django 用に 1 つのリスト テンプレートを作成し、Backbone 用に別のリスト テンプレートを作成する必要がありますか? それとも両方で同じテンプレートを使用できますか?

Handlebars テンプレートは、変数 ( ) だけを実行している場合、Django テンプレートと同様の構文を持ちます{{foo}}。ロジックを共有したい場合、2 つの構文はわずかに異なります ( {% if foo %}vs. {{#if foo}}) が、少しの解析作業を気にしなければ、簡単に変換できるほど十分に近いものです。

そうです、ユーザーの非常に小さなサブセット (バックボーンをサポートできないブラウザーを使用しているユーザー) をサポートするためだけに、多くの作業を行っていることになります。Google Analytics などでユーザーのブラウザ統計を調べて (または、サイトがまだ稼働していない場合は、一般的な Web 統計を調べて)、ユーザー ベースのごく一部にとって、これらすべての問題が本当に価値があるかどうかを判断することを強くお勧めします。 . 統計がなければ、そのパーセンテージがどれほど小さいかを知ることはできず、明らかにその決定の重要な要素です.

私たちにとっての選択は明白でした。ユーザーに今世紀に作られたブラウザを使用するように要求し (Backbone が必要とするものはほぼすべて)、すべての Backbone を使用するだけです。しかし、その選択があなたにとってそれほど明白でない場合... Django とバックボーンのコードを DRY しようとして頑張ってください :-)

于 2013-01-04T19:39:19.963 に答える
1

この問題に対するまったく別の解決策について読んだところですが、共有したいと思いました: HTML スナップショット (https://developers.google.com/webmasters/ajax-crawling/docs/html-snapshot)。私がリンクしたページは Java ベースですが、Python/Django でも似たようなものを設定できます。

基本的な考え方は、サーバーにヘッドレス Javascript ランナーをセットアップし、Web クローラーがサイトにアクセスしたときに、その JS ランナーを使用して、バックボーン コードがクライアントで正常に実行されていた場合に生成される HTML を生成するというものです。次に、その HTML を Web クローラーに送り返し、クライアントとサーバーの両方に 1 つのコード セットを提供します。

ヘッドレス JS ランナーの実行には潜在的な問題がいくつかある可能性があります (Web ブラウザーの組み込み JS と 100% 同一というわけではありません) が、この「HTML スナップショット」アプローチで使用する場合、それらはあまり関係ありません。

于 2013-01-06T17:09:43.053 に答える
0

あなたがまだこれに取り組んでいるかどうかはわかりませんが、私はこの問題の解決策を見つけることに取り組んでいます. 私はそれについて予備的なブログ投稿を書きました:

Django との JavaScript フレームワークの相互運用性

これは、Django + Backbone + Marionette + Some Other Plugins を使用して作成された "Notes" アプリの完全な例で、2 週間以内にフォローアップする予定です。

このコードは、クライアント側でも Django テンプレートを使用する方法を示しているので、役に立つかもしれません。

興味があれば、私のブログまたはツイッター (より良い) @sid_azad をフォローしてください。

于 2013-06-05T16:02:54.660 に答える