2017-09-18 43 views
0

我正在尝试制作一个显示实时更新数据的页面给客户端。该网站的其余部分是用Django构建的,所以我试图使用Channels来实现。通过Django频道和网络套件将实时更新推送到客户端

我显示的数据保存在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> 

我会与该文档的链接,这将有助于我实现这样的事情完全幸福,因为我一整周都找不到解决方案。

回答

3

添加用户的Django上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)` 

渠道集团发送任何新的更新数据,用户通过

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

不这只是添加组方程交通管理?我的主要问题是找到一种在文件更新时从文件发送新数据的方法。 – Roxerg

+0

您必须使用pynotify https://github.com/seb-m/pyinotify观看文件以进行更改。 –

+2

@Roxerg:'channels'不是为了看你的文件。实现一个调用'Group('user-1')的文件观察器。send({'text':'文件变化在这里'})'你很好走。如果您想发送数据库更改,则在数据库更改的django信号接收器中执行相同的调用。答案应该是公认的答案,因为在我看来没有什么补充。 – hoefling

相关问题