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

손해창님의 프로필 이미지
손해창

작성한 질문수

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

채팅방 퇴장시 퇴장 메시지 출력 안됨

해결된 질문

작성

·

603

0

안녕하세요.

채팅방에서 유저가 퇴장했을때 퇴장 했다는 메시지가 보여지질 않습니다. 그래서 disconnect, chat_user_leave methodprint를 추가해서 확인을 해보니 disconnect method에서 is_last_leaveTrue가 찍혀 채널 레이어 그룹에 type=‘chat.user.leave’ 메시지를 보내는 것은 되는거 같은데, 그 후 chat_user_leave method가 실행이 안되는거 같습니다. (추가한 print가 실행이 안되서 터미널에 아무것도 찍히지 않습니다.)

이 부분이 원인거 같은데 무슨 문제인지 어떻게 해결해야될지 모르겠어서 질문드립니다.

스크린샷 2023-03-22 오전 1.15.17.png스크린샷 2023-03-22 오전 1.15.28.png스크린샷 2023-03-22 오전 1.15.47.png

답변 3

0

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

현재 redis 라이브러리 버전이 4.5.1인데요.
redis 버전을 4.4.0 미만으로 낮춰서 확인해보시겠어요?

python -m pip install "redis<4.4.0"

강의에서도 언급했었는 데, 4.4.0 버전을 포함한 4.5.1에서도 뭔가 이슈가 있나봅니다.

4.4.0 미만으로 낮추니 4.3.5 버전이 설치가 되었고, 정상 작동하는 듯 보입니다.

확인해보시고, 댓글 부탁드립니다.

손해창님의 프로필 이미지
손해창
질문자

‘redis<4.4.0’으로 버전 낮춰서 실해하니 정상 작동합니다!

처음에 redis 설치할때는 4.4.0 미만으로 설치를 했던거 같은데…이 부분은 제대로 확인 못해봤네요.

코드도 문제 없는데 이것만 계속 안되서 신경쓰였는데 해결이 되었네요.

신경써주셔서 감사합니다~!

 

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

잘 해결되어서 다행입니다.

해당 이슈는 좀 더 깊게 살펴볼 수 있도록 하겠습니다.

좋은 밤 되세요. :-)

0

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

테스트하시는 과정을 영상으로 찍어서 공유 가능하실까요?

찍으신 후에, 구글드라이버나 드랍박스에 올리고 링크로 공유 등의 방법이 있을 듯 합니다.

손해창님의 프로필 이미지
손해창
질문자

https://drive.google.com/file/d/1303fPtHJQPq3wiKJm0Uv_xJjyIP3TVmf/view?usp=sharing

링크 공유드립니다.

영상 찍고 여러번 테스트를 해봤고 대부분은 chat_user_leave method 가 실행이 안되는데 가끔씩 정상적으로 chat.user.leave 메세지를 받는 경우도 확인을 했습니다.

그래서 코드는 문제가 없는거 같은데 혹시 redis를 https://app.redislabs.com/에서 사용중인데 도커나 다른걸로 redis를 설치해서 테스트 해봐야하는지 궁금합니다.

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

redislabs 서버에는 초기 접속이 느릴 뿐, 메세지가 누락되는 경우는 없을 듯 한데요.

로컬에 redis 를 설치하셔서도 한 번 테스트는 필요해보입니다.

지금의 프로젝트 코드를 공유해주시면, 저도 해창님 코드로 테스트를 해보겠습니다.

redislabs가 설정된 .env 파일도 같이 공유해주시면, 저도 확인이 용이할 듯 하니.
me@askcompany.kr 로 프로젝트 폴더를 압축해서 보내주시겠어요?

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

그리고 혹시 python -m pip list 하신 결과도 공유해주실 수 있으실까요?

손해창님의 프로필 이미지
손해창
질문자

프로젝트 폴더 압축해서 메일로 공유드렸습니다.

그리고 아래는 pip list 결과입니다.

image

0

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

안녕하세요.

보여주신 코드는 강의에서 다룬 코드와 동일해보입니다.
https://github.com/pyhub-kr/course-django-channels-basic/blob/main/chat/consumers.py

코드는 동일한데 동작이 다르다면, 테스트 방법이 다를 듯 합니다.

  1. 2개의 uesrname으로 2개의 브라우저 창에서 각각 로그인하시고

  2. 창#1에는 유저#1이, 창#2에는 유저#2가 있다고 할 때

  3. 유저#1이 새로운 채팅방을 만들어서 들어갔고, 유저#2가 같은 채팅방에 들어갔고

  4. 유저#2가 그 채팅방에서 나오면, 유저#2 측의 Consumer에서 disconnect 이벤트가 발생할 것이구요. disconnect 메서드에서 유저#2는 채팅방 그룹에서 discard합니다. 그리고 채팅방 그룹에 chat.user.leave 메세지를 보냅니다.

  5. 유저#2는 이미 채팅방 그룹에서 discard되었기 때문에 chat.user.leave 메세지를 받을 수 없구요. 유저#1의 Consumer Instance에서는 chat.user.leave 메세지를 받을 수 있습니다.

위 순서대로 차근차근 확인해보겠어요?

확인해보시고, 댓글 부탁드립니다.

화이팅입니다. :-)

손해창님의 프로필 이미지
손해창
질문자

위의 순서대로 다시 테스트를 해봤지만 여전히 chat_user_leave method는 실행이 안되는거 같습니다.

혹시 오타가 있나 싶어서 github의 코드 복붙해서 해봤지만 결과는 같아서 코드 문제는 아닌거 같은데... 여전히 문제가 뭔지 모르겠네요...

그런데 이걸 vs code debug로 disconnect의 async_to_sync(self.channel_layer.group_send)(...)에 중단점 찍고 한줄씩 계속 실행해보면 마지막에 chat_user_leave method에 추가한 print가 찍혀서 실행이 되는걸로 확인이 됩니다.

 

손해창님의 프로필 이미지
손해창

작성한 질문수

질문하기