inflearn logo
강의

講義

知識共有

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

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

431

kw42460353572

投稿した質問数 4

0

  1. 채팅방에서 마지막 유저가 나가면 채팅방 자동 삭제를 구현하기 위해 , 그 뒤에 추가 과제들도 구현하기 위해 channel_name을 따로 model로 만들고 싶습니다.

  2. channel_name을 살펴보면 specific.19f083513f9244298b2f329aa6916165!fce7333e1805488dae51ab420eeaa6a4

    으로 구성되어 있습니다.

  3. test1, test2가 있다면 먼저 접속한 유저의 channel_name중 specific.19f083513f9244298b2f329aa6916165(!전까지)를 같이 공유해서 저장하는것 같더라구요.

    -> 맞을까요?

  4. 그래서 specific.19f083513f9244298b2f329aa6916165까지는 동일하고 그 뒤에부터 다르게 저장되는것을 파악하였습니다.

  5. specific.19f083513f9244298b2f329aa6916165를 기준으로 model을 생성해서 관리하는 방법이 괜찮은 방법인지 질문드리고 싶습니다!

    1. 서버가 강제 종료되면 이전에 channel_name이 그대로 남아있어서 최종적으로 마지막으로 나갔는지 파악하기 어려워 ChannelName를 생성해서 관리하면 괜찮지 않을까 생각했습니다.

python django django-channels

回答 1

1

pyhub

안녕하세요.

채널스 웹소켓 서버와 유저가 연결이 되어있는 상태에서 강제로 종료시켰다면, 유저와의 웹소켓 연결도 모두 끊어졌을 텐데요.

프로세스 종료 시에 SIGKILL 시그널 (Kill signal)을 받으면 프로세스가 정리할 시간도 주지 않고 바로 죽여버리지만, SIGTERM 시그널 (Termination signal)은 프로세스를 종료시키는 일반적인 접근으로서 프로세스에게 종료 시그널을 보내고 프로세스가 정리할 시간을 확보해줄 수 있습니다.

프로세스를 죽이실 때에는 SIGTERM 시그널을 보내도록 해주시고,
python manage.py runserver 시에는 Ctrl-C 입력을 하시면 SIGINT 시그널이 발생하네요.

atexit는 파이썬 기본 모듈로서, 프로세스가 종료될 때 수행될 핸들러를 등록하실 수 있습니다.

asgi.py 아래에 아래와 같이 cleanup_function을 등록하실 수 있는 데요. SIGTERM 시그널과 SIGINT 시그널에서도 cleanup_function 함수가 호출되더라구요. 그러니 cleanup_function 내에서 RoomMember의 channel_names를 빈 set으로 변경하거나 정리하는 코드를 적용해보실 수도 있지 않을까요?

import atexit

def cleanup_function():
    print("Program is exiting. Cleanup function is called.")

atexit.register(cleanup_function)

 


그리고, channels_redis의 new_channel 함수 구현을 보면, 채널명을 정하는 로직은 아래와 같습니다.

image

느낌표(!) 앞의 문자열은 prefix와 client_prefix로서 이뤄지는 데요. client_prefix 값은 RedisChannelLayer 생성자에서 uuid4 값으로 1회 설정되고 계속 사용되어지고 있습니다.

image

RedisChannelLayer 인스턴스는 ASGI 프로세스마다 1회 생성되어서 사용되어집니다. 그러니 느낌표(!) 앞의 문자열은 각 채팅방을 식별할 수 있는 식별자가 될 수 없을 듯 합니다.

"채널 레이어를 활용한 프로세스간 통신" 수업에서 아래 슬라이드를 만들어놓고, 녹화에서는 불필요한 듯 하여 빼놓은 슬라이드입니다. 이 슬라이드에 InMemoryChannelLayer와 RedisChannelLayer에 대한 코드 비교가 있으니 참고해보시면 좋을 듯 합니다.

image

살펴보시고, 질문 부탁드립니다.

화이팅입니다. :-)

1

kw42460353572

첨부해주신 슬라이드와 추가 코드 설명이 매우 도움이 되었습니다. 활용해서 구성해보겠습니다. 감사합니다!

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

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

323

1

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

0

425

1

라이브러리 인식

0

414

2