问题描述
我正在尝试使用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 (将#修改为@)