websocket Django channels:当两个或多个标签打开时,保存消息到数据库中

qzlgjiam  于 2023-11-19  发布在  Go
关注(0)|答案(1)|浏览(158)

我使用此解决方案将消息保存到DB Django channels: Save messages to database
但我有一个重复的问题(在数据库中),当用户(消息的作者)有两个或更多的标签在浏览器中打开同一个聊天室。
怎么了?救命啊!

  1. import json
  2. from channels.db import database_sync_to_async
  3. from channels.generic.websocket import AsyncWebsocketConsumer
  4. from .models import Message
  5. class ChatConsumer(AsyncWebsocketConsumer):
  6. @database_sync_to_async
  7. def create_chat(self, msg, sender):
  8. return Message.objects.create(sender=sender, msg=msg)
  9. async def connect(self):
  10. self.room_name = self.scope['url_route']['kwargs']['room_name']
  11. self.room_group_name = 'chat_%s' % self.room_name
  12. await self.channel_layer.group_add(self.room_group_name, self.channel_name)
  13. await self.accept()
  14. async def disconnect(self, close_code):
  15. await self.channel_layer.group_discard(self.room_group_name, self.channel_name)
  16. async def receive(self, text_data):
  17. text_data_json = json.loads(text_data)
  18. message = text_data_json['message']
  19. sender = text_data_json['sender']
  20. await self.channel_layer.group_send(self.room_group_name, {
  21. 'type': 'chat_message',
  22. 'message': message,
  23. 'sender': sender
  24. })
  25. async def chat_message(self, event):
  26. message = event['message']
  27. sender = event['sender']
  28. new_msg = await self.create_chat(sender, message) # It is necessary to await creation of messages
  29. await self.send(text_data=json.dumps({
  30. 'message': new_msg.message,
  31. 'sender': new_msg.sender
  32. }))

字符串

92vpleto

92vpleto1#

解决方案在这里,不要从发送消息到WebSocket(到每个打开的连接/打开的浏览器的标签)的函数中调用create_chat(将数据放入数据库)。只需从receive函数中调用它。

  1. # Receive message from WebSocket
  2. async def receive(self, text_data):
  3. text_data_json = json.loads(text_data)
  4. message = text_data_json['message']
  5. sender = text_data_json['username']
  6. case = text_data_json['case_id']
  7. chat_type = text_data_json['chat_type']
  8. @sync_to_async
  9. def get_user(sender):
  10. return User.objects.get(username=sender)
  11. @sync_to_async
  12. def get_case(case):
  13. return Case.objects.get(id=case)
  14. user_obj = await get_user(sender)
  15. case_obj = await get_case(case)
  16. new_msg = await self.create_chat(user_obj, message, case_obj, chat_type)
  17. # Send message to room group
  18. await self.channel_layer.group_send(
  19. self.room_group_name, {
  20. 'type': 'chat_message',
  21. 'message': message,
  22. 'username': sender,
  23. 'case':case,
  24. 'chat_type':chat_type,
  25. 'time': new_msg.creted_time,
  26. }
  27. )

字符串

展开查看全部

相关问题