我对django-channels
很新,所以这可能是一个非常简单的问题。
在我们的网站上,有一个永久按钮"消息"在标题中。我希望用户立即收到有关新消息的通知。所以我为此目的使用频道。如果创建了新消息,我会通过channels
向客户端发送一些未经过readed的会话:
class Message(..):
def save(...):
notify_recipient(self)
def notify_recipient(self):
Group('%s' % self.recipient).send({
"text": json.dumps({
"message":{"text":truncatechars(self.text,100)},
"unreaded_conversations":Conversation.objects.get_unreaded_conversations(self.recipient).count(),
}),
})
在base.html
:
const webSocketBridge = new channels.WebSocketBridge();
webSocketBridge.connect('/notifications/');
webSocketBridge.listen(function (action, stream) {
console.log(action, stream);
var conversations_sidebar = $('#id_conversations_sidebar');
var messages_list = $('#messagesList');
if (action.unreaded_conversations) {
$('#id_unreaded_conversations_count').text(action.unreaded_conversations);
}
另一方面,有一个页面/chat/detail/<username>/
,用户可以在这里互相聊天。这个聊天应该是实时的,所以我需要通过渠道接收消息。
目前,我已向notify_recipient
方法添加了呈现的消息,但问题是它必须始终呈现消息,即使用户不在此/chat/detail/<username>/
网址上也是如此效率不高。
您是否知道如何仅在用户处于当前聊天时收到呈现的消息?
routing.py
@channel_session_user
def message_handler(message):
message.reply_channel.send({"accept": True})
@channel_session_user_from_http
def ws_connect(message,):
Group("%s" % message.user).add(message.reply_channel)
message.reply_channel.send({"accept": True})
channel_routing = [
route("websocket.receive", message_handler), # we register our message handler
route("websocket.connect", ws_connect) # we register our message handler
]