2012-06-22 13 views
24

私は単純な(つまり、メッセージングキューを処理するために別のサーバーをセットアップする必要がない)方法を探しています。計算を実行しグラフを生成する小さなWebインターフェイスです。これは私のウェブインターフェースが行う必要があるものです:Python(およびFlask)で非メッセージキュー/単純なロングポーリング

  1. ユーザーは
  2. Serverは、いくつかの計算を実行するWebインターフェイスでグラフ/データを要求します。
  3. サーバが計算を実行している間に、小さなコンテナが計算の進捗状況(AJAX/jQueryを介して)で更新されます(印刷の際のコンソールと同様です。 ))
  4. 計算終了とグラフがユーザーに表示されます。

計算がすべてサーバー側で行われているため、簡単に設定する方法がわかりません。明らかに、私は、Flaskで簡単にポーリングを処理するためのREST APIを設定したいと思うでしょう。しかし、私はどのように実際の更新を取得するか分からない。明らかに、この目的のために複雑ではあるが、解決策はメッセージキューをセットアップし、長いポーリングを行うことであろう。しかし、これが何かのための正しいアプローチであるかどうかは分かりません。

ここに私の質問は以下のとおりです。

  1. ファイルシステムを使用してこれを行う方法はありますか?パフォーマンスは大きな問題ではありません。 AJAX/jQueryはファイルからメッセージを見つけることができますか?進行状況をいくつかの.jsonファイルに保存しますか?
  2. 酸洗はどうですか? (私は実際に酸洗についてはあまりよく分かりませんが、おそらく私はメッセージを受け取ることができ、それはポーリングを処理しているAPIによって読み取ることができます)。
  3. ポーリングは適切なアプローチですか?これを処理するためのより良いまたはより一般的なパターンがありますか?

私はこの種のことがウェブ上で一般的であることを知っているので、私はものをオーバーコンプリートしていると感じています。かなり頻繁に私は何かが起こっているのを見て、いくつかの計算が(例えば、Google Analyticsで)行われている間、少し "loading.gif"イメージが実行されています。

ありがとうございました!

答えて

39

FlaskとjQueryを使用してこのようなアプリをいくつか作成しました。その経験に基づいて、私はあなたの計画が良いと言うでしょう。

  1. ファイルシステムを使用しないでください。 JavaScriptのセキュリティ問題/保護を実行します。万が一、合理的な回避策が見つかった場合でも、ポータブルまたはスケーラビリティはありません。代わりに、Flaskのような小さなローカルWebサービスフレームワークを使用します。

  2. 漬けてはいけません。 JSONを使用します。これは、WebアプリケーションとRESTインターフェイスの言語です。 jQueryとチャート、グラフなどを描画するための素敵なjQueryベースのプラグインは、JSONを期待しています。人間が読める形式で使用するのは簡単ですが、小規模なアプリケーションでは、他の場所に行く理由はありません。

  3. あなたが達成したいことについては、長いポーリングが適しています。純粋なHTTPベースのアプリケーションにはいくつかの制限があります。また、Socket.IOのようなWebSocketや同様のソケット層は「未来」です。しかし、私の経験上、サーバー側の実装の良い、簡単な例を見つけることは困難でした。私は一生懸命見ました。 Node.js、REDIS、その他のミドルウェアを設定したい例がたくさんあります。しかし、なぜ2つまたは3つの別々のミドルウェアサーバを設定する必要がありますか?それはばかげている。 Flaskのようなシンプルで純粋なPython Webフレームワーク上での長いポーリングは、IMOに行く方法です。

コードスニペットよりも少しあるので、むしろここでそれを含めてより、私はあなたが自由に確認することができますa Mercurial repository on bitbucket、コピー、またはクローンに簡略化した例を入れています。

  • serve.pyフラスコベースのサーバーがHTML
  • static/lpoll.jsのjQueryベースのクライアント
  • としてレンダリングされますのPython /フラスコベースのサーバ
  • templates/index.html 98%のHTML、2%のテンプレートファイル:3つの部分があります。
+2

ああ、ありがとうございました*この*!私は今夜​​あなたのコードを見ていきます。 「しかし、サーバー側実装の良い、簡単な例を見つけることは、私の経験では困難でした」私が持っていた正確な経験なので、私は一人ではないと聞いてうれしいです。再度、感謝します!! – aaronlevin

+0

FYI私はbottle.py(長いサブプロセススクリプトを使用)でこれを最初に試して、いくつかのブロック問題がありました。フラスカでうまくいく。ありがとう! – Nate

+0

複数のクライアントを同期させて、同時にすべての信号を受信する方法を教えてください。 – r1d3h4rd

10

ロングポーリングは単純で自然なWebサポートのサポートがほとんどのブラウザに提供され、Flaskアプリと一緒に簡単に統合される前に合理的な回避策でした。しかし、2013年中頃には、Web Socketのサポートが大きく進んでいます。

Here is an example(上記と同様ですが、FlaskとWeb Socketsが統合されています)。これはサーバコンポーネントの上でgeventgevent-websocketから実行されます。

この例は、Web Socketの傑作ではありません。これは、より簡単に比較できるように、多くのlpoll構造を保持しています。しかし、それは即座に応答性、サーバーのオーバーヘッド、およびWebアプリケーションの対話性を改善します。

関連する問題