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 |
---|