Search code examples
pythondjangodjango-channels

Django Channels async_to_sync(channel_layer.group_send()) not working


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
            }
        )

Here is my code i wrote group_send out of consumers it was not working so i added it to connect just for testing is it triggered. but it's not working

Tried with Django channels documentation no changes in code.


Solution

  • Here is how i got my answer. we cannot create custom channel name so i created group with existing channel name

    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
            }
        )
    

    in above code connect i changed from self.room_name to self.channel_name and its working perfect. It also working fine with AsyncWebsocketConsumer.