채팅 로비에서 유저수 노출을 위하여
LobbyMember 모델을 생성해서 index에 들어오면 해당 user를 추가하는 식으로 구성하였습니다.
class LobbyMember(models.Model): user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)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})정상적으로 작동하는가 싶더니 2개의 다른 브라우저에서 같은 이용자로 로그인 한 후
한 곳에서 로그아웃하면 해당 유저가 삭제되어
아직 로그인 되어 있는 쪽에서는 로그인 유저가 0명으로 표시되더라구요.
지금처럼 LobbyMember를 생성하지 않고 기존 모델로 사용하는 방법이나 방향이 있을까요? 이렇게 하는건 아닌것 같아서 질문드립니다!
回答 1
1
안녕하세요.
웹소켓 연결 시에 LobbyMember(user)를 생성하고, 웹소켓 연결이 끊어질 때 LobbyMember(user)를 삭제하도록 구성하셨는 데요.
그러니 #3에서 말씀하신 것처럼, 한 user가 연결#1이 연결된 상황에서도 연결#2의 연결이 끊어진다면, 그 user의 LobbyMember가 삭제되는 상황이 발생할 수 밖에 없습니다.
#4에서 말씀하신 것처럼 기존 모델을 활용하시는 것도 한 방법이 되겠습니다. Lobby 라는 이름의 채팅방을 고정으로 이용하는 방식인 것이죠.
살펴보시고 질문 남겨주세요.
화이팅입니다. :-)
유저목록 확인 문제 질문드립니다.
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

