将数据发送到Django频道

问题描述 投票:0回答:2

我有一个外部Python脚本,该脚本每秒生成JSON数据;另一方面,我有一个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
2个回答
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函数中,我们将两个使用者添加到group中,这样我们就建立了它们之间的通信路径,因此,当一个使用者调用send_chat_message时,它将在两个使用者上调用echo_message函数。


1
投票

您可以使用@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'])
© www.soinside.com 2019 - 2024. All rights reserved.