inflearn logo
강의

講義

知識共有

Python/Djangoでウェブチャットサービス作り (Feat. Channels) - 基本編

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

解決済みの質問

323

kw42460353572

投稿した質問数 4

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를 생성하지 않고 기존 모델로 사용하는 방법이나 방향이 있을까요? 이렇게 하는건 아닌것 같아서 질문드립니다!

python django django-channels

回答 1

1

pyhub

안녕하세요.

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

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

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

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

화이팅입니다. :-)

0

kw42460353572

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

유저목록 확인 문제 질문드립니다.

0

164

2

안녕하세요 선생님,

0

91

1

하나의 채팅방만 만들어보려고 하는데 잘 안되고 있습니다.

0

103

1

도커와 연동 관련 질문드립니다.

0

205

3

채팅방 참여자 목록 - 채팅방 입장/퇴장 실시간 이벤트 처리

0

165

2

안녕하세요, onopen() 문제로 질문드립니다.

0

137

2

Consumer Instances 관련 질문 있습니다.

0

71

2

안녕하세요, 요청은 채널스에서 먼저 받고, http 요청은 장고를 통해서 처리한다고 하셨는데요.

0

79

2

기능 구현 질문 드립니다.

0

115

1

git에 있는 코드를 다운 받아 실행 해봤는데 에러가 났습니다.

0

153

2

ValueError: No route found for path 'ws/liveblog/'.

0

133

2

지정 경로에 템플릿 파일 만드는 단축키가 뭔가요?

0

121

2

채팅 내역을 영구적으로 저장하고 싶습니다.

0

89

1

질문이 있습니다.

0

164

1

구독 채팅 구현

0

212

1

헷갈려서 질문드립니다.

0

354

2

@login_required 장식자를 적용한후에는 로그인을 성공하면 채팅방으로 어떻게 이동을 하는 건가요?

1

276

1

docker run -d --restart always --name redis7 --publish 6379:6379 redis:7

0

261

1

websocket 자바스크립트 클라이언트 구현?

0

361

1

메세지 리액션 : 좋아요. 질문 드립니다.

0

359

1

{유저명}님이 메세지 입력 중입니다. 메세지 질문드립니다.

0

609

1

채팅방에서 마지막 유저가 나가면 채팅방 자동 삭제 질문드립니다.

0

431

1

동기방식의 consumer 클래스와 비동기방식의 consumer클래스의 차이가 뭔지 궁금합니다.

0

425

1

라이브러리 인식

0

414

2