当前位置: 首页 > 知识库问答 >
问题:

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

姬熙云
2023-03-14

所以我有一个Django应用程序,其中我使用频道来实现实时聊天。我的消费者看起来像这样:

导入json从asgiref.sync导入async_to_sync从channels.generic.websocket导入WebSocket消费者

class ChatConsumer(WebsocketConsumer):
    def connect(self):
        self.room_name = self.scope['url_route']['kwargs']['room_name']
        self.room_group_name = 'chat_%s' % self.room_name
        # Join room group
        async_to_sync(self.channel_layer.group_add)(
            self.room_group_name,
            self.channel_name
        )

        self.accept()

    def disconnect(self, close_code):
        # Leave room group
        async_to_sync(self.channel_layer.group_discard)(
            self.room_group_name,
            self.channel_name
        )

    # Receive message from WebSocket
    def receive(self, text_data):
        text_data_json = json.loads(text_data)
        message = text_data_json['message']
        username = self.scope["user"]
        # Send message to room group
        async_to_sync(self.channel_layer.group_send)(
            self.room_group_name,
            {
                'type': 'chat_message',
                'message': message,
                'user': username.username
            }
        )

    # Receive message from room group
    def chat_message(self, event):
        message = event['message']
        user=event['user']
        print(user)
        # Send message to WebSocket
        self.send(text_data=json.dumps({
            'message': message,
            'user':user
        }))

因此,我正在寻找一种方法来保存发送的消息(因为当前它们在刷新时丢失)。我已经创建了一个消息模型,其中消息文本有一个CharField。如果我在聊天室信息功能中这样做,我想我可以保存新信息:

new_message=Messages(text=message)
new_nessage.save()

我的问题是,每当用户连接到聊天时,我如何预载最后10条消息?

共有1个答案

陶文林
2023-03-14

因此,为了做到这一点,我最终在“接收”功能中将我的消息保存到数据库中(因为如果将其保存在chat_message one中,则会为每个活动用户保存1次)。然后为了预加载消息,我在每次打开websocket时都使用AJAX调用,以便使用python函数获取最近的10条消息,然后我将这些消息作为JsonResponse传递回来(https://simpleisbetterthancomplex.com/tutorial/2016/08/29/how-to-work-with-ajax-request-with-django.html 向下滚动到本文的AJAX请求部分,按此顺序查看signup.html、url.py和views.py文件,以供参考)。

 类似资料:
  • 控制台-频道-聊天-发消息 接口URL {youke-url}/console/Index.php?c=live&a=setComment&timestamp=1607677497&access_key=abc&sign=5c734d046a244b27ffa74a4235a45a1b3ada5ec7 请求方式 POST Content-Type form-data 请求Query参数 参数 示例

  • 控制台-频道-聊天-删除消息 接口URL {youke-url}/console/Index.php?c=live&a=deleteComment&timestamp=1607677497&access_key=abc&sign=6513239c21beabd37f043d8f8c85ad655afcada0 请求方式 POST Content-Type form-data 请求Query参数 参

  • 控制台-频道-聊天-获取消息 接口URL {youke-url}/console/Index.php?c=live&a=getComment&timestamp=1607677497&access_key=abc&sign=97d791101db8600e162935d43cc63f0e3510cb98 请求方式 POST Content-Type form-data 请求Query参数 参数 示

  • 如何在聊天客户端发送媒体消息?我使用的是JS SDK,基于教程https://www.twilio.com/docs/api/chat/guides/media-support,但是出现了错误。我使用的方法如下所示: 错误消息:

  • 我正试图通过电报聊天发送消息。我希望电报设置只能通过官方用户界面完成,因为我希望它可能由最终用户完成。 以下是我所做的电报设置: 我通过获得令牌创建了机器人 我创建了一个通道: 点击"新频道" 通道名称: 点击下一步 选择私人频道 点击保存 添加我的机器人 点击制作管理员 点击保存 打开频道 在频道菜单上,选择“管理频道” 单击讨论中的“添加组” 单击“创建新组” 组名: 单击“创建” 单击“保存

  • 我正在尝试使用node.js、socket.io和express制作一个简单的聊天应用程序。但是,如果我单击main.jade文件中的send按钮,页面会刷新,并且不会出现任何消息。我在Firebug中也遇到这个错误: 加载页面时,与ws:/127.0.0.1:3000/socket.io/?eio=2&transport=websocket&sid=d_hnmpdxhed-j7lraaah的连接