인프런 커뮤니티 질문&답변

커리30님의 프로필 이미지
커리30

작성한 질문수

파이썬/장고로 웹채팅 서비스 만들기 (Feat. Channels) - 기본편

채팅 로비에서 유저수 노출을 위하여

해결된 질문

작성

·

246

·

수정됨

0

  1. LobbyMember 모델을 생성해서 index에 들어오면 해당 user를 추가하는 식으로 구성하였습니다.

    class LobbyMember(models.Model):
        user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
  2. consumer에도 따로 LobbyConsumer를 생성하여 접속할 땐 생성하거나 조회하고 채팅방에 접속 시 삭제하도록 하였습니다.

    class LobbyConsumer(JsonWebsocketConsumer):
        def __init__(self, *args, **kwargs):
            super().__init__(*args, **kwargs)
            self.group_name = "lobby"
    
        def connect(self):
            user = self.scope["user"]
            if not user.is_authenticated:
                self.close()
            else:
                lobby_user, _ = LobbyMember.objects.get_or_create(user=user)
                async_to_sync(self.channel_layer.group_add)(
                    self.group_name, self.channel_name
                )
                async_to_sync(self.channel_layer.group_send)(
                    self.group_name,
                    {"type": "lobby"},
                )
                self.accept()
    
        def disconnect(self, code):
            if self.group_name:
                async_to_sync(self.channel_layer.group_discard)(
                    self.group_name, self.channel_name
                )
            user = self.scope["user"]
            lobby_member, _ = LobbyMember.objects.get_or_create(user=user)
            lobby_member.delete()
            async_to_sync(self.channel_layer.group_send)(
                self.group_name,
                {"type": "lobby"},
            )
    
        def lobby(self, message_dict):
            count = LobbyMember.get_count()
            self.send_json({"type": "lobby", "count": count})
  3. 정상적으로 작동하는가 싶더니 2개의 다른 브라우저에서 같은 이용자로 로그인 한 후

    1. 한 곳에서 로그아웃하면 해당 유저가 삭제되어

    2. 아직 로그인 되어 있는 쪽에서는 로그인 유저가 0명으로 표시되더라구요.

  4. 지금처럼 LobbyMember를 생성하지 않고 기존 모델로 사용하는 방법이나 방향이 있을까요? 이렇게 하는건 아닌것 같아서 질문드립니다!

답변 1

1

이진석님의 프로필 이미지
이진석
지식공유자

안녕하세요.

웹소켓 연결 시에 LobbyMember(user)를 생성하고, 웹소켓 연결이 끊어질 때 LobbyMember(user)를 삭제하도록 구성하셨는 데요.

그러니 #3에서 말씀하신 것처럼, 한 user가 연결#1이 연결된 상황에서도 연결#2의 연결이 끊어진다면, 그 user의 LobbyMember가 삭제되는 상황이 발생할 수 밖에 없습니다.

#4에서 말씀하신 것처럼 기존 모델을 활용하시는 것도 한 방법이 되겠습니다. Lobby 라는 이름의 채팅방을 고정으로 이용하는 방식인 것이죠.

살펴보시고 질문 남겨주세요.

화이팅입니다. :-)

커리30님의 프로필 이미지
커리30
질문자

Lobby 방과 Lobby 방 전용 owner를 생성해서 해결하였습니다. 감사합니다!

커리30님의 프로필 이미지
커리30

작성한 질문수

질문하기