我试图保存使用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保存在数据库中。
答案 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
在安全,同步的上下文中调用数据库方法。