36

現在、Django で記述された非常に単純な Web アプリケーションがあり、アプリケーションにコールバック/プッシュ通知サービスのようなものを実装したいと考えています。

例: 1 人のユーザー (クライアント) がサーバーに写真をアップロードすると、サーバーは接続されている他のすべてのユーザーにその写真について通知します。

ユーザーが写真をアップロードしたときに Django シグナルを使用してコールバックを生成できると思いますが、Django に他のユーザーに通知を投稿させるにはどうすればよいですか? この通知は、アラートの場合もあれば、アップロードされた画像を表示する新しい HTML に他のユーザーを単にリダイレクトする場合もあります。私は後者を好みます。

私は Web プログラミングの初心者なので、comet や long-polling などを実装する「リアルタイム Web アプリケーション」が必要であるという法案にこれが当てはまるかどうかはわかりません。私のアプリケーションは、テキスト ファイルではなく画像ファイルを送信する点を除いて、チャット アプリケーションのアプリケーションと似ています。そのため、彗星の解決策がうまくいくと思いました。Orbited と Twisted を非常に長い間調べてみましたが、Django で実装することができませんでした。おそらく、コメット ソリューションで必要なことを達成する方法を理解していないためです。より経験豊富なプログラマーに、これを達成するために何が必要なのか、または正しい方向に向かっているかどうか (comet を使用) を指摘してもらいたいと思います。

チュートリアルのリンクやガイドだけでなく、進め方に関するヒントやヒントを教えていただければ幸いです。

4

2 に答える 2

58

HTTP は本質的に「プル」プロトコルです。つまり、クライアントはサーバーからデータをプルし、しばらく待機してから、さらにデータをプルします。サーバーからクライアントにデータを「プッシュ」する厳密な HTTP 方法は実際にはありません。

クライアントに「プッシュ」する必要がある場合、基本的に 3 つのオプションがあります。

(1) ポーリングを行う - Ajax/javascript を使用して、X 時間ごとにサーバーをポーリングします。X が小さいほどプッシュのように感じられますが、これらのリクエストに常に応答しなければならないサーバーのオーバーヘッドも大きくなります。

(2) websocketを使用します。HTML5 仕様の一部には、websockets と呼ばれるものがあります。Websockets を使用すると、ブラウザーはサーバーへの永続的な接続を開くことができます。この接続が開かれると、従来の TCP ソケットと同様に、データをクライアントからサーバーへ、およびサーバーからクライアントへプッシュすることができます。Websocket の問題点 (最後に聞いた話) は、Websocket がブラウザー間でまだ少し気まぐれである可能性があり、もちろん古いブラウザーではまったく機能しないということでした。

(3) Javascript インターフェイスで Flash を使用します。Flash には永続的な TCP 接続を設定する機能があり、「通常の」TCP 接続と同じようにデータをプッシュ/プルするために使用できます。(この SO の質問も参照してください: HTTP push examples in Flex )


このプロジェクトをゼロから開始する場合は、バックエンドをSocket.ioを使用してNode.jsで作成することをお勧めします。Socket.io は、プログラミングできる「ソケットのような」フレームワークであり、Javascript クライアント (Web ブラウザーで実行される) が、使用する最適な「永続的な接続」をインテリジェントに決定します。最初に Websockets、次に Flash、次に使用しようとします。さまざまなタイプの長いポーリング。


しかし、Python/Django を使用したいとおっしゃったので、 Django-Websockets (Djangoで websockets を使用するためのフレームワーク) を確認してください。ただし、作成者がページに掲載した免責事項を必ずお読みください。主に Django が websocket を念頭に置いて設計されていないため、使用に関連するいくつかの重大な問題/制限があります。

ユーザーのブラウザーがサポートしていない場合、最善の策は、Ajax Polling へのインテリジェントなフォールバックを備えた Websockets を使用することになると思います。

于 2011-03-30T04:43:17.410 に答える
7

良い選択であるnginxを使用する場合:)、プッシュモジュールhttp://pushmodule.slact.net/を使用できます。かなり使いやすいことがわかりました。チャネルでメッセージを公開するための 1 つの URL (httplib などを使用して Python で簡単に実行できます) と、チャネルからメッセージをプルするための 1 つの URL (チャネルは複数のユーザーによって使用される場合があります) があります。jquery の統合については、http://blog.jamieisaacs.com/2010/08/27/comet-with-nginx-and-jquery/も参照してください。

于 2011-03-30T07:20:26.773 に答える