zoukankan      html  css  js  c++  java
  • 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。。 不然你都不知道这消费者咋触发发送的。。

  • 相关阅读:
    一周的前端面试
    PHP导出超大的CSV格式的Excel表方案
    Java HashMap Demo
    Vmware 设置桥接模式
    Vue 模板
    SpringMVC 拦截器
    IntelliJ IDEA 修改缓存文件设置
    Maven 命令操作项目
    Maven 介绍
    Spring Boot 5 SpringSecurity身份验证
  • 原文地址:https://www.cnblogs.com/summers-willi/p/13632516.html
Copyright © 2011-2022 走看看