해결된 질문
작성
·
246
·
수정됨
0
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 라는 이름의 채팅방을 고정으로 이용하는 방식인 것이죠.
살펴보시고 질문 남겨주세요.
화이팅입니다. :-)
Lobby 방과 Lobby 방 전용 owner를 생성해서 해결하였습니다. 감사합니다!