首页 > 解决方案 > Django 聊天应用程序

问题描述

我正在尝试使用 Django 频道制作聊天应用程序。我已经成功构建了一个一对一的聊天应用程序,但我没有将其扩展到多个一对一聊天的想法。就像,现在只有两个用户登录,但如果多个用户互相聊天怎么办。我被困在如何为此准备模型并将数据插入数据库中。因此,如果有人可以提供帮助,我将不胜感激。

模型.py

class Chat(models.Model):
    room = models.CharField(max_length = 255, null = True)
    user = models.ForeignKey(User, on_delete = models.SET_NULL, null = True)
    message = models.TextField()
    time = models.DateTimeField(auto_now_add = True, null = True)

    def __str__(self):
        return self.user.username

视图.py

def student_messages(request, pk):
    student = Student.objects.get(id = pk)
    chat = Chat.objects.filter(room = request.user)
    if request.is_ajax():
        print(request.POST.get('chat'))
        Chat.objects.create(user = student.user, message = request.POST.get('chat'), room = request.user)
    return render(request, "main/student_messages.html", {"student": student, "chat": chat})


def instructor_messages(request, pk):
    instructor = Instructor.objects.get(id = pk)
    chat = Chat.objects.filter(room = request.user)
    notify = InstructorCourseNotification.objects.filter(instructor = instructor).order_by('-id')[:3]
    if request.is_ajax():
        print(request.POST.get('chat'))
        Chat.objects.create(user = instructor.user, message = request.POST.get('chat'), room = request.user)
    return render(request, "main/instructor_messages.html", {"instructor": instructor, "chat": chat, "notify": notify})

消费者.py

class chatConsumer(AsyncJsonWebsocketConsumer):
    async def connect(self):
        await self.accept()
        await self.channel_layer.group_add("chat", self.channel_name)
        print(f"{self.channel_name}")

    async def disconnect(self, code):
        await self.channel_layer.group_discard("chat", self.channel_name)
        print(f"removed {self.channel_name}")

    async def user_chat(self, event):
        await self.send_json(event)
        print(f"{event}")

信号.py

@receiver(post_save, sender=Chat)
def chat_notification(sender, instance, created, **kwargs):
    if created:
        channel_layer = get_channel_layer()
        async_to_sync(channel_layer.group_send)(
            "chat",
            {
            "type": "user.chat",
            "event": "New Chat",
            "user": instance.user.id,
            "message": instance.message,
            "time": json.dumps(instance.time.strftime("%d"), cls = DjangoJSONEncoder)
            })

问题是在当前的实现中,我也无法成功保存整个聊天记录。仅保存各个用户发送的消息。

标签: pythondjangowebsocketdjango-channels

解决方案


推荐阅读