Python

Django Channels & Web socket

내이름효주 2024. 8. 16. 15:48
  • Channels: http 프로토콜이 아닌 다른 프로토콜을 사용할 수 있게 해주는 django 기능
    • WebSockets, Chat protocols, IoT protocols 등을 다루며, ASGI 위에서 빌드
    • ASGI: 비동기 웹서버와의 통신을 관리하는 표준 interface
    • Channels가 설정된 후에 일반적으로 daphne, uvicorn과 같은 ASGI 서버를 사용해 웹소켓 처리
      • Daphne는 ASGI 서버 중 하나로 Channels와 같은 비동기 프레임워크를 지원하는 서버
      • Daphne는 Django 애플리케이션을 비동기적으로 실행하고, HTTP, WebSocket 및 HTTP2 요청을 처리할 수 있도록 설계, Django의 기본 WSGI 서버인 runserver와는 달리 비동기 처리를 지원하여 웹소켓과 같은 실시간 기능을 구현
  • 실행 명령어: daphne -p 8000 (프로젝트명).asgi:application

순서

  1. channels 설치
    pip install channels
  2. setting.py installed _apps에 channels 추가
    INSTALLED_APPS = [
        "django.contrib.admin",
        ···		
        "channels",
    ]
  3. 프로젝트앱/asgi.py에 routing configuration 생성
    • routing configuration: 채널 서버에서 http리퀘스트를 받았을 때 어떤 코드를 실행할지 지정해주는 asgi어플리케이션
      application = ProtocolTypeRouter({
          "http": get_asgi_application(), # HTTP 프로토콜 처리
          "websocket": AuthMiddlewareStack( # WebSocket 프로토콜 처리
              URLRouter(
                  [
                      path('ws/time/', consumers.TimeConsumer.as_asgi()),
                  ]
              )
          ),
      })

      • get_asgi_application() 함수는 Django의 ASGI(Asynchronous Server Gateway Interface) 애플리케이션을 생성하는 역할
      • ASGI와 WSGI의 차이
        • WSGI (Web Server Gateway Interface):
          • 동기식 서버와 요청 처리 방식.
          • HTTP 요청을 처리하며, 장기 실행 작업이나 비동기 작업에는 적합하지 않음.
        • ASGI (Asynchronous Server Gateway Interface):
          • 비동기식 서버와 요청 처리 방식.
          • 비동기 작업, 웹소켓, 실시간 업데이트 등 다양한 프로토콜을 지원.
    • settings.py로 가서 asgi로 연결될 어플리케이션이 이 프로젝트임을 지정
      ASGI_APPLICATION = 'MyDjangoProject.asgi.application'
  4. consumers 생성
    • channels의 views.py 느낌
    • view와의 차이는 request를 받기만 하는게 아니라 백엔드에서 프론트엔드로 주기도 함
    • connect 함수를 통해 wevsocket요청이 오면 accept함수를 사용해서 요청받은 소켓을 받음
      • asyncio 비동기 작업을 위한 python 모듈 (async 함수나 메서드를 비동기로 정의할 때 사용, await 비동기 함수 내에서 다른 비동기 함수를 호출 할때)
      • asyncio.sleep(1) 비동기 함수로써 1초 동안 대기 시킬 수 있도록