我正在尝试创建一个向客户端显示实时更新数据的页面。该网站的其余部分是使用Django构建的,所以我正在尝试使用Channels。
我显示的数据保存在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>
我非常满意这些文档的链接,这些文档可以帮助我实现这样的目标,因为我已经找不到整整一周的解决方案了。
答案 0 :(得分:5)
将用户添加到ws_connect上的django渠道组
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'})