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
순서
- channels 설치
pip install channels
- setting.py installed _apps에 channels 추가
INSTALLED_APPS = [ "django.contrib.admin", ··· "channels", ]
- 프로젝트앱/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):
- 비동기식 서버와 요청 처리 방식.
- 비동기 작업, 웹소켓, 실시간 업데이트 등 다양한 프로토콜을 지원.
- WSGI (Web Server Gateway Interface):
- settings.py로 가서 asgi로 연결될 어플리케이션이 이 프로젝트임을 지정
ASGI_APPLICATION = 'MyDjangoProject.asgi.application'
- routing configuration: 채널 서버에서 http리퀘스트를 받았을 때 어떤 코드를 실행할지 지정해주는 asgi어플리케이션
- consumers 생성
- channels의 views.py 느낌
- view와의 차이는 request를 받기만 하는게 아니라 백엔드에서 프론트엔드로 주기도 함
- connect 함수를 통해 wevsocket요청이 오면 accept함수를 사용해서 요청받은 소켓을 받음
- asyncio 비동기 작업을 위한 python 모듈 (async 함수나 메서드를 비동기로 정의할 때 사용, await 비동기 함수 내에서 다른 비동기 함수를 호출 할때)
- asyncio.sleep(1) 비동기 함수로써 1초 동안 대기 시킬 수 있도록