Python 在线聊天室开发(二):漫游聊天记录

原创
2021/08/27 11:37
阅读数 75

在上一文章中,我们借助 Django 3 + Channels + Redis(Memurai ) 实现了一个网页在线聊天室


实战 | 使用 Python 开发一个在线聊天室
但是这个聊天室的功能还稍显简陋:
  • 不能保存聊天记录,网页一刷新,发的消息都没了。

  • 没有用户认证,谁都可以输入房间号、用户名进入。

  • 不能发送表情、图片等非文本消息。

今天咱们就来把 保存和漫游聊天记录这一功能实现了。

创建数据模型

首先,在 chat 应用下的 models.py 文件中定义一个聊天消息类:
   
   
   
class Message(models.Model): username = models.CharField(max_length=255,verbose_name="用户名") room = models.CharField(max_length=255,verbose_name="聊天室") content = models.TextField(verbose_name="内容") create_time = models.DateTimeField(auto_now_add=True,verbose_name="写入时间")
然后执行迁移命令以在数据库中生成数据表:
  
  
  
  1. python manage.py makemigrations chat

  2. python manage.py migrate

聊天记录存储

有了聊天记录表之后,对于漫游聊天记录的过程就很简单了:
  • 第一步,所有用户发送的消息要存储入库;

  • 第二步,从数据库中查询聊天记录;

  • 第三步,响应给前端进行渲染。

我们首先来 处理数据的入库
之前的代码中,我们在 chat 应用中的 consumers.py 文件中通过 ChatConsumer 这个类来实现 WebSocket 的所有处理。
后端在接收到消息之后直接将消息推送给了对应房间号,现在我们需要加上数据存储的步骤。
首先,在 ChatConsumer 类中新建一个名为 save_msg() 的方法,在这个方法里面我们 接收「用户名」、「房间号」、「消息」三个参数,然后将其写入到 Message 数据模型中
   
   
   
# 保存消息 @sync_to_async() def save_msg(self,username,room,msg):         Message.objects.create(username=username, room=room, content=msg)
sync_to_async 装饰器用于将同步方法转换为异步方法,需要在文件头部引入:
  
  
  
  1. from asgiref.sync import sync_to_async

保存消息的方法创建好之后,我们在 ChatConsumer 类的 receive() 方法中间进行调用:
   
   
   
# 接收消息 async def receive(self, text_data=None, bytes_data=None): data = json.loads(text_data) message = data['message'] username = data['username'] room = data['room'] # 发送消息到房间 await self.save_msg(username, room, message) await self.channel_layer.group_send( …………
这样, WebSocket 在接收到消息之后,会首先将消息存储到数据库,再推送出去

聊天记录查询

数据库中有了数据,数据的查询就好办了。
我们在聊天室的视图函数中对指定房间号的历史消息进行查询(chat/views.py):
   
   
   
# 聊天室 def room(request,room_name): room_name = room_name username = request.GET.get('username', '游客') # 查询历史消息 msgs = Message.objects.filter(room=room_name).order_by('create_time') return render(request,'room.html',locals())
前端渲染聊天记录
我们现在可以在前端 HTML 模板中渲染聊天记录了。
相关代码如下所示:
   
   
   
<!-- 聊天记录 --> <div id="chat-record"> {% for m in msgs %} {% if m.username == username %} <div class="right_msg">{{m.username}}<div class="right-record"><span>{{m.content}}</span></div></div><br> {% else %} <div class="left_msg">{{m.username}}<div class="left-record"><span>{{m.content}}</span></div></div><br> {% endif %} {% endfor %} </div>
这样,我们在进入到指定房间的页面后,就会把历史聊天消息给漫游同步。
最终效果如下所示:


总结

在本篇文章中,我们通过 Django 的数据模型实现了聊天室的聊天记录漫游。
在接下来的文章中,我们还将继续对这个使用 Python 开发的在线聊天室进行开发和优化。
比如:
  • 用户认证;

  • 发送非文本消息;

  • 前端 VUE 改造;

敬请期待!
🧐分享、点赞、在看,让我看到你们的热情👇

本文分享自微信公众号 - 州的先生(zmister2016)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
0 评论
0 收藏
0
分享
返回顶部
顶部