Django聊天应用程序

2024-05-01 22:06:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试用Django频道制作一个聊天应用程序。我已经成功地构建了一个一对一的聊天应用程序,但我不打算将其扩展到多个一对一的聊天。比如,现在只有两个用户登录,但是如果多个用户在互相聊天呢。我被困在如何准备模型和在数据库中插入数据上。如果有人能帮忙,我会很感激的

models.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

views.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}")

signals.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)
            })

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


Tags: selfmessagegetobjectsmodelsrequestdefchat