반응형

uvicorn을 통해 websocket을 테스트 하던 중 처음 보는 오류를 발견했다.

찾아보니 app registry가 준비되기 전에 특정 라이브러리가 import 되어 발생하는 오류였고, 처음 import 한 부분을 찾아가니 나의 경우는 처음에 asgi.py를 잘못 작성해서 생긴 문제였다.

 

오류가 생긴 asgi.py 코드는

import os

from django.core.asgi import get_asgi_application
from channels.routing import ProtocolTypeRouter, URLRouter
from channels.auth import AuthMiddlewareStack
from accounts import routing

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'backend.settings')

application = ProtocolTypeRouter({
    "http": get_asgi_application(),
    "websocket": AuthMiddlewareStack(
        URLRouter(
            routing.websocket_urlpatterns
        )
    ),
})

로 django_asgi_app = get_asgi_application() 부분이 routing이 auth 보다 뒤에 나오는 상황이었다.

 

 

오류 코드를 자세히 찾아보니 routing 부분에서 consumer를 불러오고 consumer에서 rest_framework_simplejwt.tokens을 불러오는 부분에서 문제가 발생했고, app registry가 준비되기 전 해당 부분을 불러와서 발생한 오류임을 확인했다.

 

즉, get_asgi_application으로 app registry가 준비되기 전, routing에서 사용된 라이브러리 중 rest_framework_simplejwt.tokens.AccessToken이 먼저 불러와져 발생하는 오류였다.

 

 

간단하게 아래와 같이 코드 순서를 바꿔주어 오류를 수정하였다.

import os

from django.core.asgi import get_asgi_application
from channels.routing import ProtocolTypeRouter, URLRouter

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'backend.settings')
django_asgi_app = get_asgi_application()

from channels.auth import AuthMiddlewareStack
from accounts import routing

application = ProtocolTypeRouter({
    "http": django_asgi_app,
    "websocket": AuthMiddlewareStack(
        URLRouter(
            routing.websocket_urlpatterns
        )
    ),
})

 

결과적으로 잘 작동하는 것을 확인했다.

반응형

'BackEnd > django' 카테고리의 다른 글

[django] LocMemCache 배포 시 문제점  (0) 2024.09.01

+ Recent posts