保存数据Django Channels 2

时间:2019-02-25 07:56:31

标签: django websocket django-channels

我试图保存使用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保存在数据库中。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

好像您的使用者扩展了WebsocketConsumer(同步使用者)。如果是这种情况,请删除@database_sync_to_async装饰器,应该没问题。如果您的使用者不同步,则只需要这样做。

从文档中

  

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

     

如果您使用的是SyncConsumer或其他基于JsonWebsocketConsumer的内容,则无需做任何特殊的事情,因为所有代码都已经在同步模式下运行,并且Channels将作为SyncConsumer代码的一部分为您进行清理。

     

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