爬了一天的管網方文檔,終於搞定了這個channels了。主要還是搞了半天的主動推送(吐槽下:哎,同學們眼神一定要好啊。。)
官方地址:https://channels.readthedocs.io/en/latest/index.html
照着官網的實例去搭建,就可以。 現在這記錄下幾個可能會碰到的坑。
1、在app中加載的channels的時候,有可能會啟動失敗。這時候得把channels放在最上面
2、channels的實現需要依賴asgi ,這是wsgi的繼承版,django3.0以上項目生成的時候根目錄下會自動生成這個文件了。一般不用改
3、當你照着官網實例搭建到消費者這個類的時候,一定要注意receive這個方法里的 type ,和下面那個方法的關系,這個type的value就是你所需要把消息推送到這個消費者類的方法的名稱
def receive(self, text_data=None, bytes_data=None):
text_data_json = json.loads(text_data)
message = text_data_json['message']
# Send message to room group
async_to_sync(self.channel_layer.group_send)(
self.room_group_name,
{
'type': 'push_message',
'message': message
}
)
def push_message(self, event):
message = event['message']
# Send message to WebSocket
self.send(text_data=json.dumps(message))
4、當你想在某個地方主動推送消息給group的時候,需要引用channels.layers 的get_channel_layer()這個方法
通過它去send消息到推送到該group的消費者類指定的方法里。
await self.channel_layer.group_send( room.group_name, { "type": "push_message", # 消費者類里你發送消息的方法名 "room_id": room_id, "username": self.scope["user"].username, "message": message, } )
5、一定要注意這個type。。 不然你都不知道這消費者咋觸發發送的。。