不能点击私信:能选中用户但是不能发送消息进行通信?如何改,谢谢!

来源:6-3 通用类视图ListView源码详解

慕的地2047357

2021-05-11

  1. 老师这是浏览器端报的错500,后端代码排查。我没有找到错误。您帮我在看看。

    consumer.py代码是:

  2. import json
    from channels.generic.websocket import AsyncWebsocketConsumer
    class MessagesConsumer(AsyncWebsocketConsumer):
        """处理私信应用中WebSocket请求"""
        async def connect(self):
             if self.scope['user'].is_anonymous:
            # 未登录的用户拒绝连接
             await self.close()
             else:
               await self.channel_layer.group_add(self.scope['user'].username, self.channel_name)
              await self.accept()
        async def receive(self, text_data=None, bytes_data=None):
            """接收私信"""
            await self.send(text_data=json.dumps(text_data))
        async def disconnect(self, code):
            """离开聊天组"""
            await self.channel_layer.group_discard(self.scope['user'].username, self.channel_name)

    urls.py代码是:

  3. from django.urls import path
    from zanhu.messager import views
    app_name = 'messager'
    urlpatterns = [
        path('', views.MessagesListView.as_view(), name='messages_list'),
        path('send-message/', views.send_message, name='send_message'),
        path('<username>/', views.ConversationListView.as_view(),name='conversation_detail'),

        

    views.py代码是:

  4. @login_required
    @ajax_required
    @require_http_methods(["POST"])
    def send_message(request):
       """发送消息,AJAX POST请求"""
       sender = request.user
       recipient_username = request.POST['to']
       recipient = get_user_model().objects.get(username=recipient_username)
       message = request.POST['message']
       if len(message.strip()) != 0 and sender != recipient:
           msg = Message.objects.create(
               sender=sender,
               recipient=recipient,
               message=message
           )
           channel_layer = get_channel_layer()
           payload = {
               'type': 'receive',
               'message': render_to_string('messager/single_message.html', {"message": msg}),
               'sender': sender.username
           }
           # group_send(group: 所在组-接收者的username, message: 消息内容)
           async_to_sync(channel_layer.group_send)(recipient.username, payload)
           return render(request, 'messager/single_message.html', {'message': msg})
       return HttpResponse()

写回答

4回答

Jack

2021-05-12

第10-15小节有排错思路讲解

1
0

Jack

2021-05-12

您好,这个reconneting-websocket.js代码没有问题的,现在是ws链接建立失败,后端500报错。应该是自己开发的代码哪里写错了。需要提供相关视图和consumer.py的代码

1
1
慕的地2047357
老师,我把问题修改了。代码添加了过来,您在帮我看看
2021-05-16
共1条回复

Jack

2021-05-20

不好意思,回复太迟。最近人累傻了

0
0

Jack

2021-05-20

您好,代码中没有看出问题。redis服务是否正常启动?收到500报错前后,可以去看看redis里面数据是否有变化,另外,username不能用中文

0
0

Django高级实战 开发企业级问答网站

融合Django高级用法/算法/设计模式/TestCase测试/云计算打造项目

900 学习 · 756 问题

查看课程