web-dev-qa-db-ja.com

DjangoユーザーにHTTP応答をプッシュする

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

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

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

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

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

35
evkwan

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

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

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

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

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


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


しかし、Python/Djangoを使用したいと言ったので、 Django-Websockets -DjangoでWebSocketを使用するためのフレームワークを確認する必要があります。しかし、著者がページに書いた免責事項を必ず読んでください。いくつかの重大な問題があります/主にDjangoはWebSocketを念頭に置いて設計されていないため、使用に関連する制限。

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

57
Chris W.

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

7
fylb