Django Channels를 알기전 websocket 알아가기
웹 소켓은 HTML5의 표준 기술로, 사용자의 브라우저와 서버 사이의 동적인 양방향 연결 채널을 구성합니다. Websocket API를 통해 서버로 메시지를 보내고, 요청 없이 응답을 받아오는 것이 가능합니다. 현재 API는 W3C에서 관장하고 있으며 프로톸로은 IETF에서 관리하고 있습니다. 웹 소켓은 별도의 포트를 사용하지 않고 HTTP와 같은 80번 포트를 사용하고 있는데, 이 때문에 클라이언트인 웹브라우저 뿐만 아니라 웹 서버도 기능을 지원하고 있어야만 합니다.
Django Channels
Channels는 웹소켓, 채팅 프로토콜, IoT 프로토콜 등을 처리하기 위해 Django를 HTTP이상으로 확장하는 프로젝트입니다. ASGI라는 Python 사양을 기반으로 합니다.
ASGI
- Asynchronous Server Gateway Interface의 줄임말 입니다.
- 비동기가 가능한 Python 웹서버, 프레임워크 및 응용 프로그램 간의 표준 인터페이스를 제공하기 위한 WSGI의 후속 제품입니다.
- WSGI가 앱에 대한 표준을 제공했다면 ASGI는 이전 버전과의 호환성 구현, 다중서버 및 애플리케이션 프레임워크를 통해 비동기 및 동기 앱 모두에 대한 표준을 제공합니다.
Channels는 v3.0부터 Django에서 사용할 수 있는 기본 ASGI지원을 기반으로 하며 Django v2.2에 대한 구현 자체를 제공합니다. Django는 여전히 전통적인 HTTP를 처리하지만 채널은 동기 또는 비동기 스타일로 다른 연결을 처리할 수 있는 선택권을 제공합니다.
Django Channels 설치하기
1. 터미널 창에 pip install channels로 설치하기
2. INSTALLED_APPS에 추가하기
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
...
'channels',
)
3. 프로젝트 폴더 안에 있는 asgi.py파일을 다음과 같이 조정합니다.
import os
from channels.routing import ProtocolTypeRouter
from django.core.asgi import get_asgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mysite.settings')
application = ProtocolTypeRouter({
"http": get_asgi_application(),
# Just HTTP for now. (We can add other protocols later.)
})
만약 Django 버전이 2.2면 내장된 ASGI 지원이 없으므로 다음과 같이 만들되겠습니다.
import os
import django
from channels.http import AsgiHandler
from channels.routing import ProtocolTypeRouter
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mysite.settings')
django.setup()
application = ProtocolTypeRouter({
"http": AsgiHandler(),
# Just HTTP for now. (We can add other protocols later.)
})
4. 마지막으로 settings.py에 들어가서 ASGI_APPLICATION으로 해당 라우팅 개체를 루트 응용 어플리케이션으로 가리키도록 설정을 다음과 같이 해주겠습니다.
ASGI_APPLICATION = "myproject.asgi.application"
이렇게 하면 django에 통합 되어서 runserver명령어와 통합할 수 있습니다.
만약 나중에 써드파티앱에서 실행할때 whitenoise의 whitenoise.runserver_nostatic이랑 충돌이 날 경우 문제가 되는 앱을 INSTALLED_APPS에 리스트된 channels위에 올리거나 아니면 완전히 제거하면 되겠습니다.
최신 개발 버전 설치
최신 버전의 채널을 설치하려면 리포지토리를 복제하고 리포지토리로 변경하고 리포지토리 디렉터리로 변경하고 현재 가상 환경에 pip 설치합니다.
$ git clone git@github.com:django/channels.git
$ cd channels
$ <activate your project’s virtual environment>
(environment) $ pip install -e . # the dot specifies the current repo
댓글