バージョン:0.2他のユーザー(
herbalifeチャットではない)のアクションに応じて、特定の数のユーザーのページをリアルタイムでアトミックに更新する必要がありました。
もちろん 、あなたはすべてをゴミ箱に捨てて、
tornado / twisted.webで最初からそれを
ギャッシュできますが、すべてが必要なとき、それは明らかに最も生産的な方法ではありません(そして、私は一度も良くありません)-それはすでに
Djangoで動作し、ほんの少し...当然、ここで
はWebSocketが要求されます。 そして、すべてはDjango
WSGIアプリケーションに他ならないでしょう。そしてこの標準は、(今のところ)そのようなトリックを意味しません。 インターネットのグーグル検索
は、よく知られたパイソンの達人
kmikeの仕事につながりました (これは皮肉なことではありません。彼の仕事が私を何度も助けてくれたからです。
したがって、
socket.ioまたは
sockjs jsライブラリを使用してDjangoプロジェクトをwebsocketとクロスさせたい場合は、お気軽に!
更新について
この記事の最初のバージョンは、Socket.ioを使用したバージョンのみに当てられました。 その過程で、ライブラリが失敗した接続を常に判断するとは限らないという奇妙な感覚が生じました。 つまり ソケットを長時間ダンプするとき、彼女はしがみつきませんでした。 私自身が何か間違ったことをしたことを完全に認めます。 記事の最初のバージョンのコメントで、人々は
sockjsを推奨し
ました (最終的に切り替えたので、自分のイニシアチブで)、私はこのオプションをチェックすることにしました。 その結果、libはすべての歯との接続にしがみついていますが、サーバー側が応答を停止すると、奇妙な状況が発生しました(これもおそらく私たちのせいですが、理由はまだ解明中です)。 いずれにせよ、写真を完成させるために記事を補足することにしました(Googleからの友人の緊急の要請がない限りではありません)。 一般的に、実装の選択はあなたに任せます。
エントリー
長い間、非同期の何かを試してみたかったのですが、それでも正当な理由はありませんでした。必要があり、どこから始めるべきかは完全に不明でした。 実際、ここで最も関連性の高いものを作成しようとします(私自身は上記のドキュメントを出発点として取りましたが、かなり古く、いくつかの改善がすでに現れています)。 Djangoのおなじみの小島があり、そこに新鮮な風を吹き込む方法を示します...
ちなみに、
kmikeの仕事から、いくつかの機能が変更なしで使用されました。著者が気にしないことを願っています。
何を得る
その結果、メインdjangoサイトの隣でスピンし、ユーザーがどのdjangoをリクエストを送信/受信するかを知る非同期サービスを取得し、[サービス]はdjangoからコマンドを受信し、ユーザーのブラウザーでアクションを実行します。
例
たとえば、仮想の交換を考えてみましょう。 彼女にはモデレーターとクライアントがいます。 すべてがうまく機能しました。ここでは、モデレーターにリアルタイムで取引所のポジションの変化を見る機会を与える必要がありました。 同時に、モデレーターはエクスチェンジのポジションで何らかの形で操作でき、ページをリロードすることはできません。
それ以前は、全員が
F5のソーセージでした...そして、一般的に、
highload自体は 、特に興味がありません。
ツール
仕事には、次のものが必要です。
pip install redis tornado-redis pip install tornadio2 pip install sockjs-tornado .
また、
socket.ioまたは
sockjsライブラリ理論
tornadio2ライブラリを使用して、
sockjsのsocket.ioおよび
sockjs-tornadoを操作します。これらは、自然にtornado非同期フレームワークに基づいています。 このケースは、djangoの
管理チーム(hello
スーパーバイザー )として
開始されます。 トルナディオがない場合のジャングルのプレイには特に問題はありませんが、その代わりに、
PubSubが
Redis機能で解決する小さなギャグがあります(要するに、これらは
パブリッシャーのプッシュメッセージと
サブスクライバーが受信するチャネルまたはメッセージキューです)。
言い訳
プレイが進むにつれて、注意深い読者は、本質的に同期であるジャンゴ機能の使用などの矛盾に気付くかもしれませんが、これは急速な発展のための小さな犠牲です。 さらに、最初はハイロイドの話はありません。これは包括的なソリューションではなく、出発点です。 ですから、実装の微妙な違いやコードのボトルネックを楽しんでもらいたいと思います。
また、私がいつも参照しているドキュメントの
kmikeの言い訳も参照してください。
練習する
ソースのコメントには多くの説明があるため、実践は実用的です。
service.py
実際、ブラウザへの接続をサポートするサービス自体は、djangoからコマンドを受信し、それらをクライアントに送信します(逆の方向でも同様)。
on_message
メソッド
on_message
実装に必要ですが、上記の例では必要ありません。 すべてがnewfangledイベントモデル(socket.io用)に実装されています。
socket.ioの実装
sockjsの実装
models.py
変更のソース。 モデルにしましょう。
実際、ここで
lock
と
done
メソッドは、ある種のビジネスロジックを実行した後、必要な情報を含むメッセージを送信します。 この情報は上記のサービスによって受信され、処理されてクライアントのブラウザーに送信されます。
つまり アクションは標準スキームに従ってユーザーによって実行されました:彼はリンクをクリック/ボタンを押し、djangoは必要なアクションを実行し、websocket経由で配信するためにチャンネルに通知を送信し、ユーザーに古典的な応答を返しました。
client.js
選択に応じて、htmlに
socket.io.jsまたは
sockjs.jsを読み込むことを忘れないでください(記事の冒頭のリンク)。
実際には、このすべてのアクションの評価-クライアント側で動作します。
socket.ioの実装
var socket = io.connect('http://' + window.location.host + ':8989');
sockjsの実装
socket_connect(); function socket_connect() { socket = new SockJS('http://' + window.location.host + ':8989/orders');
async_server.py
これは
管理コマンドです。ファイルは
myProject/orderApp/management/commands
フォルダーに入れる必要があります。各サブフォルダーのファイルは
__init__.py
です。
socket.ioの実装
# -*- coding: utf-8 -*- import tornado import tornadio2 as tornadio from django.core.management.base import NoArgsCommand from myProject.order.tornado.service import Connection class Command(NoArgsCommand): def handle_noargs(self, **options): router = tornadio.TornadioRouter(Connection) app = tornado.web.Application(router.urls, socket_io_port=8989) # tornadio.SocketServer(app)
sockjsの実装
# -*- coding: utf-8 -*- import tornado import tornadio2 as tornadio from django.core.management.base import NoArgsCommand from myProject.order.tornado.service import Connection class Command(NoArgsCommand): def handle_noargs(self, **options): router = SockJSRouter(Connection, '/orders') # sockjs :( app = tornado.web.Application(router.urls) app.listen(8989) tornado.ioloop.IOLoop.instance().start()
これで、
python manage.py async_server
開始でき
python manage.py async_server
。