I am using django channels for the first time and can't wrap my head around something. Here is what I am trying to achieve; I want to create a new message in ChatConsumer which is all good and fine. Problem occurs when i try to pass the id of the chat that new message was created in. I don't get any errors or feedback or nothing. It just fails silently.
Here is the code base
class ChatConsumer(WebsocketConsumer): """ On initial request, validate user before allowing connection to be accepted """ #on intial request def connect(self): self.room_name = self.scope['url_route']['kwargs']['room_name'] self.room_group_name = f'chat_{self.room_name}' async_to_sync(self.channel_layer.group_add)( self.room_group_name, self.channel_name ) # accept connection self.accept() # send response self.send(text_data=json.dumps({ 'type':'connection_established', 'message':'You are connected' })) def receive(self, text_data): # get data sent from front end text_data_json = json.loads(text_data) # message message = str(text_data_json['form']['message']) if message.strip() == "": message = None # try to decode image or set to none if not available try: base64_image = text_data_json['form']['image'] if base64_image.startswith('data:image'): base64_image = base64_image.split(';base64,')[1] img_name = random.randint(1111111111111,999999999999999) data = ContentFile(base64.b64decode(base64_image), name= 'image' + str(img_name) + '.jpg') except AttributeError: data = None # send message sender = self.scope['user'] # extract chat ID chat_id = int(self.scope['url_route']['kwargs']['room_name']) try: _chat = Chat.objects.get(id = chat_id) except Chat.DoesNotExist: self.close() _requesting_user = self.scope['user'] # make sure user is in the conversation before attempting to create message if _chat.user_1 == _requesting_user.id or _chat.user_2 == _requesting_user.id: # get host address from header dictionary base = self.scope['headers'] host = '' for _ in base: if _[0] == b'origin': host = _[1].decode('utf-8') break chat_user = ChatUser.objects.get(user = sender) # if message is valid, create. if message != None or data != None: new_message = Message.objects.create(message = message, chat = _chat, user = chat_user, media = data) # boradcast chat id to chat list consumer of other user after creation #get receiver id if sender.id == _chat.user_1: receiver_id = int(_chat.user_2) else: receiver_id = int(_chat.user_1) receiver = f'user_{sender.id}' # send message to that user consumer... CODE DOESN'T SEND ANYTHING BUT PROGRAMS PROCECEED SUCCESSFULLY async_to_sync(self.channel_layer.group_send( f"user_{receiver_id}", { 'type':'new_message_signal', 'chat_id' : _chat.id } )) _serialized_data = _serialize_message(user = _requesting_user, base = host, message= new_message) # set up alert both users of new message _chat.user_1_has_read = False _chat.user_2_has_read = False _chat.save() # broadcast to group async_to_sync(self.channel_layer.group_send)( self.room_group_name, { 'type':'chat_message', 'message' : _serialized_data } ) def chat_message(self, event): message = event['message'] # get user to check if message being broadcast to them was sent by them user = self.scope['user'] chat_user = ChatUser.objects.get(user = user) if chat_user.id != message['user']: message['from'] = True else: message['from'] = False # get chat to mark all users currently in connection as read chat = Chat.objects.get(id = int(message['chat'])) if user.id == chat.user_1: chat.user_1_has_read = True if user.id == chat.user_2: chat.user_2_has_read = True chat.save() # send response self.send(json.dumps({ 'type':'new_message', 'message' : message })) Here is the ChatListConsumer instance meant to receive and handle it
class ChatListConsumer(WebsocketConsumer): def connect(self): user = self.scope['user'] # get user on start of connection self.room_group_name = f"user_{user.id}" # add each user to their own group while they're online async_to_sync(self.channel_layer.group_add)( self.room_group_name, self.channel_name ) # add group self.accept() print(self.room_group_name) self.send(text_data=json.dumps({ 'type' : 'connected', 'message':'You have been connected' })) def receive(self, text_data): data = json.loads(text_data) print(data) def new_message_signal(self, event): # receive signal from other consumer print(event) chat_id = event['chat_id'] # id of chat to send back to front-end print(f"Chat is of new chat is {chat_id}.")# nothing happens Nothing happens. Both channels work indivdually. I can send to and from both the chat and the global sockets individually. Just when i try to pass from chat to global afterwards, it fails silently.