在上一篇文章中,我们借助 Django 3 + Channels + Redis(Memurai ) 实现了一个网页在线聊天室。
不能保存聊天记录,网页一刷新,发的消息都没了。
没有用户认证,谁都可以输入房间号、用户名进入。
不能发送表情、图片等非文本消息。
创建数据模型
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="写入时间")
python manage.py makemigrations chat
python manage.py migrate
聊天记录存储
第一步,所有用户发送的消息要存储入库;
第二步,从数据库中查询聊天记录;
第三步,响应给前端进行渲染。
# 保存消息
@sync_to_async()
def save_msg(self,username,room,msg):
Message.objects.create(username=username, room=room, content=msg)
from asgiref.sync import sync_to_async
# 接收消息
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(
…………
聊天记录查询
# 聊天室
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())
<!-- 聊天记录 -->
<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>

总结
用户认证;
发送非文本消息;
前端 VUE 改造;
本文分享自微信公众号 - 州的先生(zmister2016)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。