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

posted on 2020-09-08 14:52  五十已到  阅读(1969)  评论(1编辑  收藏  举报