保存数据 Django Channels 2

Posted

技术标签:

【中文标题】保存数据 Django Channels 2【英文标题】:Saving data 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 保存在数据库中。

【问题讨论】:

你是怎么解决这个问题的? 【参考方案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 条发送的消息?

以上是关于保存数据 Django Channels 2的主要内容,如果未能解决你的问题,请参考以下文章

Django 频道实时聊天保存发送的消息

如何将 Django 应用程序设置保存在数据库中,或即时更改?

Django Channels 2:两种身份验证方法

Django Channels 2.x 还是 Ajax?

Django从视图中调用api保存数据

使用 django 动态添加输入字段并将数据保存到数据库