2017-09-18 8 views
0

ライブ更新データをクライアントに表示するページを作成しようとしています。残りのサイトはDjangoで構築されていますので、私はこれにチャンネルを使用しようとしています。DjangoのチャンネルとWebSocketsを通じてライブアップデートをクライアントにプッシュ

私が表示しているデータは、JSONファイルとMySQLデータベースの両方に保存され、サイトの他の部分でさらに計算されます。理想的には、受信した最新の受信データ(ファイルが更新されたとき)をクライアントに表示したいと考えています。

私はチャネルがこの目的のために正確に構築されていることを理解していますが、私はそれを行うのに苦労しています。

私は、消費者の遅延とループでクライアント側から複数のリクエストを送信しようとしましたが、(皮肉なことに)リフレッシュまたはアップデート時にただちに更新されます。しかし、これらのアプローチのいずれも、ファイルまたはデータベースの変更によって引き起こされるものではありません。

これは「動作する」コードですが、実際には必要なことはしません。使用

# consumers.py 
def ws_connect(message): 
    message.reply_channel.send({"accept": True}) 

def ws_receive(message): 

    with open("data.json") as jsonfile: 
    jsondata = json.load(jsonfile) 

    res = json.dumps(jsondata) 
    message.reply_channel.send({ "text": res, }) 

#routing.py 
from channels.routing import route 
from .consumers import ws_receive, ws_connect 


channel_routing = [ 
    route("websocket.receive", ws_receive, path=r"^/websockets/$"), 
    route("websocket.connect", ws_connect, path=r"^/websockets/$"), 
] 

JS(また、確かに、そこに何が...基本的にありません):

<script> 
var wsurl = "ws://" + "mywebsite.com" + "/websockets/"; 
socket = new WebSocket(wsurl); 

socket.onopen = function() { 
    socket.send("this is a request"); 
    console.log('sent'); 
    } 

socket.onmessage = function(message) { 
    console.log(message.data); 
    document.getElementById("livedata").innerHTML = message.data; 
} 
</script> 

は、私は私がこのような何かを達成するのを助けるでしょうドキュメントへのリンクと完全に幸せになりたいです私が1週間にわたって解決策を見つけられなかったので、

答えて

3

Group('user-1').send({'text': 'hello user 1'}) 
Group('user-2').send({'text': 'hello user 2'}) 
+0

によってユーザに任意の新しい更新データを送信ws_connect

from channels.auth import channel_session_user_from_http from channels import Group @channel_session_user_from_http def ws_connect(message, **kwargs): http_user = message.user if not http_user.is_anonymous: message.reply_channel.send({'accept': True}) Group('user-'+str(http_user.id)).add(message.reply_channel)' 

上のチャネルグループをDjangoのためにユーザーを追加しますが、これは単にトラフィック管理のための方程式にグループを追加しませんか?私の主な問題は、更新されたファイルから新しいデータを送信する方法を見つけることです。 – Roxerg

+0

変更のためにファイルを見るには、pynotify https://github.com/seb-m/pyinotifyを使用する必要があります。 –

+2

@Roxerg: 'channels'はあなたのためにファイルを見ることを意図していません。 'Group( 'user-1')を呼び出すファイルウォッチャーを実装してください。send({'text': 'ここでファイルが変更されます'})'あなたは良いです。 DB変更を送信したい場合は、db変更時にdjangoシグナル受信機で同じ呼び出しを行います。私の意見では何も追加しないので、答えは受け入れられたものになるはずです。 – hoefling

関連する問題