async def receive(self, text_data):
text_data_json = json.loads(text_data)
my_type = text_data_json.get("type")
if not my_type:
user = text_data_json["roomData"]["host"]
message = text_data_json["message"]
# 그룹에게 같은 메세지 전달
await self.channel_layer.group_send(
self.room_group_name,
{"type": "chat_message", "message": f"{user}: {message}"},
)
else:
await self.my_type()
프론트에서 receive
로 받아오는 메세지중에서,
type
이 존재할 때 그 type
의 value
값과 이름이 일치하는 함수로 요청을 보내버리려는 게 목적이었다.
근데 이렇게 하면 안돼서 찾아보니까 getattr
이라는 python
내장 함수가 있었다.
getattr(object, name[, default])
형식은 위와 같다.
맨 첫번째에 가져올 객체, 그 다음에 이름을 담는다
그리고 default
값을 설정해줄 수 있는데, 이는 객체 값이 없을 때 예외 처리를 하기에 유용하다.
receive
에
async_to_sync(channel_layer.group_send)(
f"room_{room_id}",
{"type": "start_game"},
)
이런식으로 메세지가 가고 있다고 가정하면,
async def receive(self, text_data):
...
else:
await getattr(self, message)()
이런식으로 호출해버리는 거다!