簡體   English   中英

將數據發送到 Django 通道

[英]Sending data to Django channels

我有一個外部 Python 腳本每秒生成 JSON 數據; 另一方面,我有一個 Django 應用程序。 我想 stream 在我的 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)

有沒有具體的方法可以做到這一點? 還是我應該在中間使用其他服務?任何建議表示贊賞

您可以做的是使用 @database_sync_to_async 裝飾器將該數據倒入 DB model。 看看下面的例子

 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'])

您可以使用用於將兩個或多個“消費者”連接在一起的通道層。 例如,您想構建一個聊天室應用程序並希望一個房間中的多個用戶“實時”相互發送消息,您必須使用通道層進行鏈接然后向上。

    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 function 中,我們將兩個消費者添加到一個中,這樣我們已經建立了它們之間的通信路徑,所以現在當消費者調用 send_chat_message 時,它將在兩個消費者上調用 echo_message function。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM