django channels 實現實時通訊,主動推送


爬了一天的管網方文檔,終於搞定了這個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。。 不然你都不知道這消費者咋觸發發送的。。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM