爬了一天的管网方文档,终于搞定了这个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。。 不然你都不知道这消费者咋触发发送的。。