首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django-Channels:另一个与websocket相同的聊天消费者

Django-Channels:另一个与websocket相同的聊天消费者
EN

Stack Overflow用户
提问于 2020-08-09 08:01:53
回答 1查看 266关注 0票数 1

所以我正在做一个使用websockets的项目,它工作得很好。我决定将websocket连接包含到另一个页面,所以我决定在我的routing.py中添加另一个页面,我还为另一个页面做了另一个ChatConsumer,问题是我释放了他们是两个不同的连接,我如何才能使我的另一个聊天消费者与其他聊天消费者相同,使这个连接成为相同的websocket连接?

这是我的consumer.py:

代码语言:javascript
复制
import asyncio
import json 
from django.contrib.auth import get_user_model
from channels.consumer import AsyncConsumer
from channels.db import database_sync_to_async

from .models import Thread, ChatMessage

class ChatConsumer(AsyncConsumer):
    async def websocket_connect(self, event):
        print("connected", event)

        other_user = self.scope['url_route']['kwargs']['username']
        me = self.scope['user']
        # print(other_user, me)
        thread_obj = await self.get_thread(me, other_user)
        self.thread_obj = thread_obj
        chat_room = f"thread_{thread_obj.id}"
        self.chat_room = chat_room
        await self.channel_layer.group_add(
            chat_room,
            self.channel_name
        )

        await self.send({
            "type": "websocket.accept"
        })
        # await asyncio.sleep(10)

    async def websocket_receive(self, event):
        # when a message is received from the websocket
        print("receive", event)

        front_text = event.get('text', None)
        if front_text is not None:
            loaded_dict_data = json.loads(front_text)
            msg =  loaded_dict_data.get('message')
            user = self.scope['user']
            username = 'default'
            if user.is_authenticated:
                username = user.username
            myResponse = {
                'message': msg,
                'username': username,
            }

            await self.create_chat_message(user, msg)

            # broadcast the message event to be send
            await self.channel_layer.group_send(
                self.chat_room,
                {
                    "type": "chat_message",
                    "text": json.dumps(myResponse)
                }
            )

    async def chat_message(self, event):
        # sends the actual message
        await self.send({
            "type": "websocket.send",
            "text": event['text']
        })

    async def websocket_disconnect(self, event):
        # when the socket connects
        print("disconnected", event)

    @database_sync_to_async
    def get_thread(self, user, other_username):
        return Thread.objects.get_or_new(user, other_username)[0]

    @database_sync_to_async
    def create_chat_message(self, me, msg):
        thread_obj = self.thread_obj
        return ChatMessage.objects.create(thread=thread_obj, user=me, message=msg)

也许您会说“为什么不在路由中使用chatconsumer呢?”,我不能使用chatconsumer,因为它给出了这个错误。

代码语言:javascript
复制
File "./consumers.py" in websocket_connect
other_user = self.scope['url_route']['kwargs']['username']
'username'

谢谢你的帮助

EN

回答 1

Stack Overflow用户

发布于 2020-08-09 09:17:04

如果您想让多个使用者访问同一个websocket连接,则需要考虑使用multiplexing解决方案,请参阅:https://github.com/hishnash/channelsmultiplexer

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63321282

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档