Сохранение данных Django Channels 2 - PullRequest
0 голосов
/ 25 февраля 2019

Я пытаюсь сохранить данные, которые я получаю от своего клиента, используя каналы Django.

Я прочитал документацию, но она не очень ясна.

Вот мой код customer.py

 def receive(self, text_data):
        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': 'chat_message',
                'message': message
            }
        )

        # Receive message from room group

    def chat_message(self, event):
        message = event['message']

        # Send message to WebSocket
        message2 = message[1]
        self.save_data(message2)
        self.send(text_data=json.dumps({
            'message': message2
        }))

    @database_sync_to_async
    def save_data (self, message):
        return DeviceLogs.objects.create(voltage=message)

Как вы уже заметили, я просто хочу сохранить message2 в базе данных.

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

Похоже, ваш потребитель расширяет WebsocketConsumer (синхронизация потребителя).Если это так, удалите декоратор @database_sync_to_async, и все должно быть в порядке.Это нужно делать только в том случае, если ваш потребитель работает асинхронно.

Из документов:

Django ORM является синхронным фрагментом кода, и поэтому, если вы хотите получить к нему доступ изасинхронный код, который вы должны сделать специальную обработку, чтобы убедиться, что его соединения закрыты правильно.

Если вы используете SyncConsumer, или что-нибудь на его основе - как JsonWebsocketConsumer - вам не нужно делатьничего особенного, поскольку весь ваш код уже запущен в синхронном режиме, и Channels выполнит для вас очистку как часть кода SyncConsumer.

Однако, если вы пишете асинхронный код, вам потребуетсявызывать методы базы данных в безопасном, синхронном контексте, используя database_sync_to_async.

0 голосов
/ 25 февраля 2019

Не уверен, в чем проблема в вашем коде, но это должно работать для вас.

async def chat_message(self, event):
    ...
    message2 = message[1]
    await self.save_message(message2)
    ...

@database_sync_to_async
def save_message(self, message):
        ... save message here
...