【问题标题】:Django Channels - self.channel_layer.group_send not calling functionDjango Channels - self.channel_layer.group_send 不调用函数
【发布时间】:2020-04-09 08:07:38
【问题描述】:

我正在创建一个具有聊天/投票功能的游戏。我已经在基于 Django Web 框架的 oTree 中实现了它。聊天是使用 Django Channels 进行的,在每个游戏中,一个人都有一个与其他玩家的网络,需要投票/回答问题。

我已经在我的消费者中定义了一个“send_choice”函数,但是当我将它作为类型引用时,它永远不会被实例化。

routing.py

from . import consumers
from django.conf.urls import re_path

websocket_routes = [
    re_path(r'ws/chat/(?P<group_pk>[0-9]+)$', consumers.ChatConsumer),
    re_path(r'ws/network_voting/(?P<player_pk>[0-9]+)/(?P<group_pk>[0-9]+)$', consumers.NetworkVoting)
]

consumers.py

class NetworkVoting(AsyncJsonWebsocketConsumer):

    def clean_kwargs(self):
        self.player_pk = self.scope['url_route']['kwargs']['player_pk']
        self.group_pk = self.scope['url_route']['kwargs']['group_pk']

    async def connect(self):
        self.clean_kwargs()
        # Join
        await self.channel_layer.group_add(
            self.connection_groups(),
            self.channel_name
        )

        await self.accept()
        print("Connected to Network Socket")

    async def disconnect(self, close_code):
        self.clean_kwargs()
        await self.channel_layer.group_discard(
            self.connection_groups(),
            self.channel_name
        )
        print("Disconnected from Network Socket")

    def connection_groups(self, **kwargs):
        group_name = self.get_group().get_channel_group_name()
        personal_channel = self.get_player().get_personal_channel_name()
        return "{}-{}".format(group_name, personal_channel)

    def get_player(self):
        return Player.objects.get(pk=self.player_pk)

    def get_group(self):
        return Group.objects.get(pk=self.group_pk)

    async def receive(self, text_data):
        self.clean_kwargs()
        text_data_json = json.loads(text_data)
        msg = text_data_json['message']

        await self.channel_layer.group_send(
                    "network_voting",
                    {
                        "type": "send_choice",
                        "message": "Hello"
                    }
                )

    async def send_choice(self, event):
        message = event['message']

        # Send message to WebSocket
        await self.send(text_data=json.dumps({
            'message': message
        }))

        print("Sent message")

【问题讨论】:

  • 你能解决这个问题吗?我也面临同样的问题。

标签: python django websocket django-channels otree


【解决方案1】:

通过群组发送消息时被频道调用,您需要订阅该群组。

自从您发送到network_voting 后,您需要订阅此内容。

await self.channel_layer.group_add("network_voting", self.channel_name)

您还需要在断开连接时取消订阅。

如果您的组名是静态的,Channels 提供了一种简单的方法,您可以在实例上设置属性 groups

class NetworkVoting(AsyncJsonWebsocketConsumer):

    groups = ['network_voting']

频道会为您处理订阅和退订。

【讨论】:

猜你喜欢
  • 2021-07-24
  • 1970-01-01
  • 2020-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多