【问题标题】:Sending data to Django channels将数据发送到 Django 通道
【发布时间】:2020-04-03 09:14:40
【问题描述】:

我有一个每秒生成 JSON 数据的外部 Python 脚本;另一方面,我有一个 Django 应用程序。我想在我的 Django 应用程序的网页上流式传输这些数据。我已经用 Django 通道构建了一个消费者,但我不知道如何让 Django 拥有我从其他 Python 脚本生成的数据。

这是我的基本消费者:

class EchoConsumer(AsyncConsumer):
    async def websocket_connect(self, event):
        print("connected", event)


        await self.send({
            "type": "websocket.accept"
        })


    async def websocket_receive(self, event):
        print("received", event)
        # Echo the same received payload

    async def websocket_disconnect(self, event):
        print("disconnected", event)

有具体的方法吗?还是我应该在中间使用其他服务?任何建议表示赞赏

【问题讨论】:

    标签: python django websocket django-channels


    【解决方案1】:

    您可以使用用于将两个或多个“消费者”连接在一起的通道层。例如,您想构建一个聊天室应用程序并希望一个房间中的多个用户“实时”相互发送消息,您必须使用通道层进行链接。

        async def start_chat(self, event):
            auth_user = self.scope['user']
            data = event['data']
            recipient_user = data['recipient']
    
            self.chat_room = f'thread_{self.thread.id}'
    
            await self.channel_layer.group_add(
                self.chat_room,
                self.channel_name
            )
    
        async def send_chat_message(self, event):
            message = await self.create_message_db(event.get('data'))
            message_data = MessageReadOnlySerializer(message).data
    
            # encoding the UUID object to json
            uid = message_data['sender']
            message_data['sender'] = json.loads(json.dumps(uid, cls=utlis.UUIDEncoder))
    
            await self.channel_layer.group_send(
                group=self.chat_room,
                message={
                    'type': 'echo.message',
                    'data': {
                        'message': message_data
                    }
    
                }
            )
    
        async def echo_message(self, event):
            await self.send_json(event)
    

    上面的代码是如何使用通道层的示例。在 start_chat 函数中,我们将两个消费者添加到一个,这样我们就在他们之间建立了一条通信路径,所以现在当消费者调用 send_chat_message 时,它​​将在两个消费者上调用 echo_message 函数.

    【讨论】:

    • 我不知道这个用例。这可能就是我要找的,谢谢!
    【解决方案2】:

    您可以做的是使用 @database_sync_to_async 装饰器将该数据倒入数据库模型。看看下面的例子

     async def websocket_receive(self, event):
       message = await self.create_message_db(event.get('data'))
    
     @database_sync_to_async
      def create_message_db(self, data):
          return Message.objects.create(thread=self.thread, sender=self.scope['user'], 
                 body=data['message'])
    

    【讨论】:

    • 嘿,我考虑将它更新到数据库,但由于它是实时数据,我每秒都会上传大量数据,使用数据库可能会让我遇到性能问题,所以我暂时不能用
    • @Sile 那么你可以使用通道层将两个或多个消费者连接在一起。
    • 感谢您的回答!你能详细说明一下吗?
    猜你喜欢
    • 2019-03-02
    • 2020-07-16
    • 1970-01-01
    • 2021-03-02
    • 1970-01-01
    • 2014-10-01
    • 2012-05-18
    • 1970-01-01
    • 2021-02-28
    相关资源
    最近更新 更多