【问题标题】:Saving data Django Channels 2保存数据 Django Channels 2
【发布时间】:2019-02-25 07:56:30
【问题描述】:

我正在尝试使用 Django 频道保存从客户端接收的数据。

我已阅读文档,但不是很清楚。

这是我的 consumer.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 保存在数据库中。

【问题讨论】:

  • 你是怎么解决这个问题的?

标签: django websocket django-channels


【解决方案1】:

不确定您的代码有什么问题,但这应该适合您。

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

【讨论】:

  • @database_sync_to_async 有助于保持连接干净并确保 connection 在操作后关闭
  • 没有数据被保存。此外,我正在使用 async_to_sync
【解决方案2】:

看起来您的消费者扩展了WebsocketConsumer(同步消费者)。如果是这种情况,请删除 @database_sync_to_async 装饰器,它应该没问题。如果你的消费者是异步的,你只需要这样做。

来自文档:

Django ORM 是一段同步代码,因此如果您想从异步代码中访问它,您需要进行特殊处理以确保其连接正确关闭。

如果你使用SyncConsumer,或者任何基于它的东西——比如JsonWebsocketConsumer——你不需要做任何特别的事情,因为你的所有代码都已经在同步模式下运行并且Channels会进行清理作为SyncConsumer 代码的一部分为您服务。

但是,如果您正在编写异步代码,则需要在安全的同步上下文中调用数据库方法,使用 database_sync_to_async

【讨论】:

  • 嘿,我能得到一些帮助吗?我设法保存了数据,并且我使用与 OP 相同的消费者。加载聊天室时如何预加载最近 10 条发送的消息?
猜你喜欢
  • 2020-05-26
  • 1970-01-01
  • 1970-01-01
  • 2019-02-16
  • 1970-01-01
  • 2019-10-04
  • 1970-01-01
  • 1970-01-01
  • 2021-07-24
相关资源
最近更新 更多