• 카테고리

    질문 & 답변
  • 세부 분야

    풀스택

  • 해결 여부

    미해결

channels with uvicorn

24.02.19 14:13 작성 조회수 122

0

안녕하세요 선생님

강의도 둘러보고, 질문게시판도 찾아보고 며칠동안 시도를 해보다

개발 중 풀리지 않는 부분이 있어 질문을 드리려합니다.

(강의와 연관성이 있을지 모르겠습니다만 질문드려봅니다)

 

일단 현재 gunicorn의 worker로 uvicorn을 사용하는 환경을 구성하였고, 이에 따라 병렬 + 비동기 처리가 가능해진 상황에서 websocket을 활용해보려는 시도 중에 있습니다.

 

session time이 만료되면 웹소켓을 활용하여 브라우저에 시그널을 주려고 하는데요,

session관리는 redis로 구성하였고

channels와 uvicorn을 조합하여 웹소켓을 관리하려 시도해보고 있습니다.

 

나름 uvicorn을 활용하여 디버깅 환경도 맞춰 놓았고, whitenoise를 활용하여 static 파일의 서빙도 해결해놓은 상태입니다.

 

기존 선생님의 웹소켓 강의가 daphne으로 구축되어있는 것으로 파악이 되어 별도로 강의를 수강하진 않았습니다만, 채팅이 아닌 양방향 통신을 위한 웹소켓의 활용에 channels + redis + uvicorn 조합이 어떤지에 대한 견해를 여쭙고 싶습니다.

 

그리고 로그인 이후 home 앱에 들어왔을때 웹소켓을 최초로 열려고 하는데 (세션은 그 전에 생성됩니다) socket 경로인 ws://127.0.0.1:8000/ws/session_expiry/ 경로를 찾을 수 없다는 문제가 계속 되고 있습니다.

이에 대한 해결 법도 궁급합니다. 대략적인 셋팅 화면 캡쳐해서 올립니다.

 

settings 구조

config.local (테스트 과정이라 local에만 있습니다, WSGI_APPLICATION은 base에 선언되어있습니다)

config.asgi

 

앱/routing 파일

앱/consumers 파일

웹소켓 관련 js

파이참에서는

NotImplementedError: subclasses of LazyObject must provide a _setup() method

INFO: connection open

INFO: connection closed

요렇게 에러가 뜹니다.

혹 channels 강의를 들으면 알 수있는 부분이라면 알려주시면 수강할 수 있도록 하겠습니다!

항상 감사드립니다 선생님!

답변 1

답변을 작성해보세요.

0

안녕하세요.

channels는 채널레이어로서 redis 만을 공식지원하니까 사용해야하구요.
gunicorn+uvicorn도 많이 사용하는 듯 보입니다.

말씀하신 NotImplementedError: subclasses of LazyObject must provide a _setup() method 오류는 경로를 찾을 수 없다는 오류가 아닙니다. 요청 URL에 맞춰 Consumer를 찾아서 요청을 처리하는 중에 LazyObject를 참조하는 코드에서 해당 예외가 발생한 것으로 보여집니다.

channels scope에서는 user와 session 구현에서 LazyObject를 사용하고 있습니다. user와 session을 커스텀한 코드가 있으실까요?

보여주신 코드 만으로는 위 예외가 발생하는 이유가 보여지지 않습니다.

살펴보시고 댓글 남겨주세요.

화이팅입니다. :-)

master님의 프로필

master

질문자

2024.02.19

첨부양이 많을 것 같아 이메일로 전달드리도록 하겠습니다.

감사합니다 ^^

질답은 가급적 인프런 페이지 내에서 이뤄졌으면 합니다. 질답은 공유되어야하고, 본 쓰레드 만으로 질문의 맥락이 다른 분들에게도 전달되어야하니깐요.

현재 이슈는 ASGI를 통한 웹소켓 요청 처리 중에 발생하는 이슈 아닌 지요? 보내주신 코드는 HTTP 요청을 처리하는 코드라서 본 질문의 맥락과는 거리가 있어 보입니다.

그리고, 에러 메시지만 보여주시기보다, 에러의 전체 traceback와 함께 에러가 발생한 지점에 대한 정보도 같이 공유해주시면 에러의 원인을 파악하기 보다 수월합니다. 코드 만 보고 상상 만으로 오류 상황을 시뮬레이션할 수는 없거든요.

살펴보시고, 댓글 부탁드립니다. ;-)

master님의 프로필

master

질문자

2024.02.26

안녕하세요 선생님, 며칠동안 이것저것 많이 시도 해보고 왔습니다.

우선 삭제하시기 전 댓글에 따라 redis의 세션을 웹소켓을 통한 연동은 일단 방향을 선회하여 js 측이랑 redis 측을 맞춰주는 방향으로 바꿨습니다.

대대적인 공사를 하다보니, 다시 돌아가서 같은 에러를 띄워보려해도 뜨질 않아서 다시한번 문제가 되면 질문을 드리겠습니다 ㅠㅠ

다음 질문때는 전체 traceback과 함께 질문을 올릴 수 있도록 하겠습니다.

항상 감사드립니다!