Python (および Flask) での非メッセージキュー / シンプルなロングポーリング 質問する

Python (および Flask) での非メッセージキュー / シンプルなロングポーリング 質問する

私は、計算を実行してグラフを作成する小さな Web インターフェイスでロング ポーリングを実行するための簡単な方法 (つまり、メッセージ キューを処理するために別のサーバーを設定する必要がない方法) を探しています。これが私の Web インターフェイスで実行する必要があることです。

  1. ユーザーがウェブインターフェースでグラフ/データを要求する
  2. サーバーはいくつかの計算を実行します。
  3. サーバーが計算を実行している間、小さなコンテナーが計算の進行状況とともに更新されます (おそらく AJAX/jQuery 経由) (コンソールで print を使用して実行する操作 (つまり、print '密度関数を計算しています...') と同様)
  4. 計算が終了し、グラフがユーザーに表示されます。

計算はすべてサーバー側で行われるため、これを簡単に設定する方法がよくわかりません。明らかに、ポーリングを処理するために REST API を設定する必要がありますが、これは Flask では簡単です。ただし、実際の更新を取得する方法がわかりません。この目的には複雑ではありますが、明らかな解決策は、メッセージ キューを設定して長時間のポーリングを実行することです。ただし、これがこれほど単純なものに適切なアプローチであるかどうかはわかりません。

私の質問は次のとおりです:

  1. ファイルシステムを使用してこれを行う方法はありますか? パフォーマンスは大きな問題ではありません。AJAX/jQuery はファイルからメッセージを見つけることができますか? 進行状況を .json ファイルに保存できますか?
  2. ピクル化についてはどうですか? (ピクル化についてはあまり詳しくありませんが、メッセージ辞書をピクル化して、ポーリングを処理している API で読み取ることができるかもしれません)。
  3. ポーリングは正しいアプローチでしょうか? これを処理するのに、より優れた、またはより一般的なパターンはありますか?

この種のことは Web ではよくあることだとわかっているので、物事を複雑にしすぎている気がします。何かが起きて、計算が行われている間に小さな「loading.gif」画像が実行されるのをよく見かけます (たとえば、Google Analytics など)。

ご協力いただきありがとうございます!

ベストアンサー1

私は Flask と jQuery だけを使ってこのようなアプリをいくつか構築しました。その経験からすると、あなたの計画は良いと思います。

  1. ファイルシステムを使用しないでください。JavaScript のセキュリティ問題や保護に遭遇するでしょう。万が一、妥当な回避策が見つかったとしても、移植性や拡張性は得られません。代わりに、Flask などの小規模なローカル Web サービス フレームワークを使用してください。

  2. 漬け込まないでください。JSON を使用します。これは Web アプリと REST インターフェイスの言語です。jQuery と、チャートやグラフなどを描画するための優れた jQuery ベースのプラグインは、JSON を前提としています。JSON は使いやすく、人間が読み取ることができ、小規模なアプリの場合は、他の場所を使用する理由はありません。

  3. 達成したい目的にはロングポーリングで十分です。純粋な HTTP ベースのアプリにはいくつかの制限があります。また、WebSocket や Socket.IO のような同様のソケット風レイヤーは「未来」です。しかし、私の経験では、サーバー側の実装の優れたシンプルな例を見つけるのは困難でした。一生懸命探しました。Node.js、REDIS、その他のミドルウェアを設定することを要求する例は数多くあります。しかし、なぜ 2 つまたは 3 つの別々のミドルウェア サーバーを設定する必要があるのでしょうか。ばかげています。したがって、Flask のようなシンプルで純粋な Python Web フレームワークでのロング ポーリングが、私の意見では最適な方法です。

コードは単なる断片以上のものなので、ここには含めず、簡略化した例を載せました。Bitbucket 上の Mercurial リポジトリ自由にレビュー、コピー、複製できます。3 つの部分があります。

  • serve.pyPython/Flaskベースのサーバー
  • templates/index.html98% HTML、2% テンプレートファイルは Flask ベースのサーバーによって HTML としてレンダリングされます。
  • static/lpoll.jsjQueryベースのクライアント

おすすめ記事