Отправка данных на Django каналов - PullRequest
0 голосов
/ 03 апреля 2020

У меня есть внешний Python скрипт, который генерирует JSON данные каждую секунду; с другой стороны у меня есть приложение Django. Я хотел бы передать эти данные на веб-странице в моем приложении Django. Я уже создал потребитель с Django каналами, но я не знаю, как заставить Django иметь данные, которые я генерирую из другого Python сценария.

Вот мой базис c Потребитель:

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)

Есть ли определенный c способ сделать это? Или я должен использовать другой сервис в середине? Любой совет ценится

Ответы [ 2 ]

1 голос
/ 03 апреля 2020

Вы можете использовать канальный слой, который используется для соединения двух или более «Потребителей» вместе. Например, вы хотите создать приложение для комнаты чата и хотите, чтобы несколько пользователей в комнате отправляли друг другу сообщения в режиме «реального времени», а затем вам нужно было связать их, используя слой каналов.

    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 для обоих потребителей.

1 голос
/ 03 апреля 2020

Что вы можете сделать, это вылить эти данные в модель БД с помощью декоратора @ database_sync_to_asyn c. Взгляните на следующий пример

 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'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...