如何添加收件箱通知系统和从一个用户Django频道删除消息

问题描述

我正在尝试使用Django,Django-rest-framework和Django-channels构建类似于Messenger的应用程序。 目前,我只能将消息从一个用户发送到另一用户。但是我想添加一些功能,例如,新消息将与用户名一起放在收件箱的顶部,并且一个用户可以从自己的侧面删除消息,就像Messenger,Whats App等一样。当某人发送消息时,他的消息就会打开顶部,并显示一条通知。 我无法找到完善的模型设计和完善的系统。

Model.py

from django.contrib.auth import get_user_model
from django.db import models

User = get_user_model()


class Message(models.Model):
    sender = models.ForeignKey(User,on_delete=models.CASCADE,related_name='sender_messages')
    receiver = models.ForeignKey(User,related_name='receiver_messages')
    text = models.TextField()
    date_created = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return '{} to {}'.format(self.sender.name,self.receiver.name)

消费者

import json

from asgiref.sync import async_to_sync
from django.contrib.auth import get_user_model
from channels.generic.websocket import WebsocketConsumer

from .models import Message

User = get_user_model()


class ChatConsumer(WebsocketConsumer):

    def connect(self):
        """
        Join channel group by chatname.
        """
        self.group_name = 'chat_{0}'.format(self.scope['url_route']['kwargs']['chatname'])

        async_to_sync(self.channel_layer.group_add)(
            self.group_name,self.channel_name,)

        self.accept()

    def disconnect(self,close_code):
        """
        Leave channel by group name.
        """
        async_to_sync(self.channel_layer.group_discard)(
            self.group_name,self.channel_name
        )

    def receive(self,text_data):
        """
        Receive message from websocket and send message to channel group.
        """
        text_data_json = json.loads(text_data)
        name = text_data_json['name']
        message = text_data_json['message']

        # Store message.
        receiver = User.objects.get(
            name=self.group_name.replace('chat_','')
                .replace(self.scope['user'].name,'')
                .replace('-',''))
        Message(sender=self.scope['user'],receiver=receiver,text=message).save()

        async_to_sync(self.channel_layer.group_send)(
            self.group_name,{
                'type': 'chat_message','name': name,'message': message,}
        )

    def chat_message(self,event):
        """
        Receive message from channel group and send message to websocket.
        """
        self.send(text_data=json.dumps({
            'name': event['name'],'message': event['message'],}))

视图


class HomeView(LoginRequiredMixin,TemplateView):
    template_name = 'home.html'

    def get_context_data(self,**kwargs):
        context = super().get_context_data(**kwargs)
        # List all users for chatting. Except myself.

        context['users'] = User.objects.exclude(id=self.request.user.id) \
            .values('name')
        context['users'] = User.objects.exclude(gender=self.request.user.gender)
        return context


class ChatHomeApi(viewsets.ModelViewSet):
    serializer_class = InboxRetrieveSerializer
    authentication_classes = [TokenAuthentication]
    pagination_class = GeneralPagination

    def get_queryset(self):
        return Chat_Inbox.objects.filter(sender=self.request.user)


class ChatView(LoginRequiredMixin,TemplateView):
    template_name = 'chat.html'

    def dispatch(self,request,**kwargs):
        # Get the person we are chatting with,if not exist raise 404.
        receiver_name = kwargs['chatname'].replace(
            request.user.name,'').replace('-','')
        kwargs['receiver'] = get_object_or_404(User,name=receiver_name)
        return super().dispatch(request,**kwargs)

    def get_context_data(self,**kwargs):
        context = super().get_context_data(**kwargs)
        context['receiver'] = kwargs['receiver']
        return context


class MessagesAPIView(LoginRequiredMixin,View):

    def get(self,chatname):
        # Grab two users based on the chat name.
        users = User.objects.filter(name__in=chatname.split('-'))
        # Filters messages between this two users.
        result = Message.objects.filter(
            Q(sender=users[0],receiver=users[1]) | Q(sender=users[1],receiver=users[0])
        ).annotate(
            name=F('sender__name'),message=F('text'),).order_by('date_created').values('name','message','date_created')

        return JsonResponse(list(result),safe=False)


因此,基本上,我想在收件箱顶部显示新消息,并且一个用户可以从他的身边删除消息,但这可能不会影响其他用户。 预先感谢

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)