2016-07-07 7 views
1

私はPythonとDjangoには新しく、私はDjangoでWebソケットを実装しようとしています。
私は何をしているのですか?websockets documentation
問題は、説明したサーバー側のコマンドをコンソールで実行する必要があることです。私はコンソールからそれを動作させると動作しますが、私はGET要求と非同期にDjangoビュー内で実行したいと思います。私はそれを試してみると、サーバはこのような例外を発生させるRuntimeError: There is no current event loop in thread 'Thread-2'
具体的には、リアルタイムログを表示する技術を使用したいと思います。たとえば、Oracleプロシージャは挿入を実行し、サーバーはWebSocketを使用してページに挿入します。
説明を実装するための間違った経路にいるのですか、誰かが正しい/より良い解決策を提案できますか? 6.7Django websocketsの実装


UPDATE
上記URLと私からの正確なコード:私はDjangoの開発サーバとUwsgiとnginxのサーバーの両方に実装さDjangoのバージョン1.9、RedHatEnterpriseServerリリース上のPythonのバージョン3.5.2によ

それをビューに入れてください。

def ws(request): 

    async def time(websocket, path): 
     while True: 
      now = datetime.datetime.utcnow().isoformat() + 'Z' 
      await websocket.send(now) 
      await asyncio.sleep(random.random() * 3) 

    start_server = websockets.serve(time, '192.168.4.177', 9876) 

    asyncio.get_event_loop().run_until_complete(start_server) 
    asyncio.get_event_loop().run_forever() 

return render(request,"ws.html") 

このビューでURLを処理すると、上記のエラーが発生します。マイws.html


+0

あなたは何を試してみませんか? – juankysmith

+0

@juankysmithアップデートをご覧ください。 – arminrock

答えて

1

Djangoのリクエスト/レスポンスサイクルは、厳密に同期している上記のWebSocketのドキュメントの例から正確なコピーです。あなたがしようとしていることは、通常のDjangoビューでは不可能です。

この制限を取り除くことを目的としたプロジェクトDjango Channelsに興味があるかもしれません。

1

あなたは本当にこれを行うことはできません。なぜ私はあなたが得ている正確なエラーを取得しているのかはわかりませんが、DjangoビューへのGETリクエストは有限の時間の後に応答を返す必要があり、永遠に実行されるのではなく、ブラウザ(またはNginx)は、非応答をタイムアウトとして表示します。 websocketサーバーを実行したい場合は、Django以外の別のプロセスで実行してください。

チャンネルの形で、Djangoのに非同期機能とWebSocketをを追加するための多くの現在進行中の仕事があります - 私はhttp://channels.readthedocs.io/en/latest/のドキュメントは、現在すでに使用できるコードの最新バージョンだと思います。うまくいけばそれはDjango 1.10の一部になるでしょう。現在のバージョンはDjangoでウェブソケットを作ることを可能にするDjangoアプリケーションとして利用できるはずですが、上記のように簡単ではありません。

+0

チャンネルは1.10の[https://groups.google.com/forum/#!topic/django-developers/QRd4v7OErT8]にはなりませんが、近い将来別のアプリとして公開されることに注意してください。あなたがそれを使うのを止めてはいけません! – knbk

+0

答えの後、私は "channles"の概念と実装を読み、学び始めました。フィードバックありがとう – arminrock