2023-06-28 TIL

0v0baek·2023년 6월 28일
1

TIL

목록 보기
85/92

[Django channels] 프론트에서 받아온 receive 값을 처리하기

기본적으로 프론트에서 웹소켓을 통해 send한 값들은 receive로 들어오게 된다.
받아오는 유형이 채팅 메세지 말고도 여러가지가 있어서, 딕셔너리를 사용해 구분해주기로 했다.

    async def receive(self, text_data):
        """웹소켓 receive

        프론트에서 받아온 데이터를 처리
        Args:
            text_data : 프론트에서 넘어오는 데이터.
                        {"type" : "유형", **kwargs}
        """
        data = json.loads(text_data)
        type_dict = {
            "join_room": self.receive_join_room,
            "invitation": self.receive_invitation,
            "chat_message": self.receive_chat_message,
            "start_game": self.receive_start_game,
            "correct_answer": self.receive_correct_answer,
            "result": self.receive_result,
        }
        await type_dict[data["type"]](data)

이런식으로, 받아온 text_datajson.loadspython에서 사용할 수 있게 변환시켜주고
그 안의 typevalue값 유형을 딕셔너리로 처리했다.

그러고 각 함수로 넘겨준다.

   async def receive_result(self, event):
        user = self.scope["user"]
        result_message = {
            "type": "send_message",
            "method": "chat_message",
            "message": f"{user}의 정답 개수 : {self.quiz_count}",
        }
        await self.channel_layer.group_send(self.room_group_name, result_message)

    async def send_message(self, event):
        """그룹으로부터 각자 메세지 받기

        receive 메소드에서 group_send로 메세지를 보냈을 때 받는 메소드
        """

        # 웹소켓에 메세지 전달
        await self.send(text_data=json.dumps(event))

받아온 메세지를 토대로 그룹 전체에게 뿌려주는 건 group_sendsend_message 메소드를 이용했다.

넘어온 event에서 message 값은 담아주고, method라는 새로운 key value쌍으로 프론트에서 유형을 구분해서 처리할 수 있게 담아준다.

그리고 그 데이터 값을 group_send로 그룹에 속해있는 모든 유저들에게 뿌려준다.

profile
개발 공부 하는 비전공자 새내기. 꾸준히 합시다!

0개의 댓글