Django 通道 async_to_sync(channel_layer.group_send()) 不起作用

问题描述 投票:0回答:1
class AllEventConsumer(WebsocketConsumer):
    def connect(self):
        self.room_name = str(self.scope['url_route']['kwargs']['user_id'])
        self.room_group_name = 'all_event_'+self.room_name
        print('connect')
        print(self.room_group_name)
        async_to_sync(self.channel_layer.group_add(
            self.room_group_name,
            self.room_name
        ))
        async_to_sync(self.channel_layer.group_send(
            self.room_group_name , {
                'type': 'update.list',
                'value': 'Value'
            }
        ))
        self.accept()
        event = Synopsis_Event.give_all_events(self.room_name)
        self.send(text_data=json.dumps({
            'room_id': self.room_group_name,
            'payload': event
        }))

    def update_list(self, event):
        print('inside update_list')
        print(event)
        data = json.loads(event['value'])
        self.send(text_data=json.dumps({
            'payload': data
        }))

    def disconnect(self, close_code):
        async_to_sync(self.channel_layer.group_discard)(
            self.room_name, self.room_group_name
        )
        self.disconnect(close_code)

    def receive(self, text_data=None, bytes_data = None):
        print('DEF')
        print(type(json.loads(text_data)))
        async_to_sync(self.channel_layer.group_send)(
            self.room_group_name , {
                "type": "update.list",
                "value": text_data
            }
        )

这是我从消费者中编写的 group_send 代码,它不起作用,所以我添加它来连接只是为了测试它是否被触发。但它不起作用

尝试使用 Django 通道文档,代码没有变化。

python django django-channels
1个回答
0
投票

这就是我得到答案的方式。 我们无法创建自定义频道名称,因此我使用现有频道名称创建了组

class AllEventConsumer(WebsocketConsumer):
def connect(self):
    self.room_name = str(self.scope['url_route']['kwargs']['user_id'])
    self.room_group_name = 'all_event_'+self.room_name
    print('connect')
    print(self.channel_name)
    async_to_sync(self.channel_layer.group_add)(
        self.room_group_name,
        self.channel_name
    )
    temp_data = {
            'type': 'update_list',
            'value': 'Value'
        }
    async_to_sync(self.accept())
    async_to_sync(self.channel_layer.group_send)(
        self.room_group_name ,
        temp_data
    )
    event = Synopsis_Event.give_all_events(self.room_name)
    self.send(text_data=json.dumps({
        'room_id': self.room_group_name,
        'payload': event
    }))

def update_list(self, event):
    print('inside update_list')
    print(event)
    # data = json.loads(event['value'])
    self.send(text_data=json.dumps({
        'payload': event
    }))

def disconnect(self, close_code):
    async_to_sync(self.channel_layer.group_discard)(
        self.room_name, self.room_group_name
    )
    self.disconnect(close_code)

def receive(self, text_data=None, bytes_data = None):
    print('DEF')
    print(type(json.loads(text_data)))
    async_to_sync(self.channel_layer.group_send)(
        self.room_group_name , {
            "type": "update.list",
            "value": text_data
        }
    )

在上面的代码连接中,我从 self.room_name 更改为 self.channel_name ,其工作完美。它也可以与 AsyncWebsocketConsumer 一起正常工作。

© www.soinside.com 2019 - 2024. All rights reserved.