保存数据 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的主要内容,如果未能解决你的问题,请参考以下文章