django channels 는 웹소켓을 django project 에서 사용할 수 있게 해주는 도구입니다. 웹소켓 관련 유명 도구로는 Socket.io 가 있습니다. 그러나 사용언어는 파이썬이 아닌 자바스크립트입니다. channels는 최근 정식으로 django project 안에 들어가게 되었습니다. 

django project 의 channels 공식 채택 : https://www.djangoproject.com/weblog/2016/sep/09/channels-adopted-official-django-project/

channels 의 공식문서 : https://channels.readthedocs.io/en/latest/


1. channels를 쓰기위한 준비


django channels를 쓰기 위해선 몇 가지 파이썬 패키지를 다운받아야 합니다.

그 전에 파이썬 가상환경을 설정합니다.


$ mkdir example-channels
$ cd example-channels
$ python3.6 -m venv myenv
$ source myenv/bin/activate
cs


그 다음에 pip를 이용해서 패키지를 다운받습니다.


(myenv)$ pip install django==1.10.5 channels==1.0.2 asgi_redis==1.0.0
cs


asgi_redis는 redis를 쓸 경우에 필요하겠지만 이 경우엔 redis를 다운받아서 실행되는지 확인해보고 설치하는 것을 추천합니다. 그렇지 않다면 asgi_redis는 굳이 다운받지 않아도 됩니다. 다른 방법으로도 실행되게 할 수 있습니다. 만약 실행된다면 프로젝트와 앱을 생성합니다. 


(myenv)$ django-admin.py startproject example
(myenv)$ cd example
(myenv)$ python manage.py startapp exam
(myenv)$ python manage.py migrate
cs


2. django 설정


그 후 settings.py 에서 exam 앱과 channels를 등록합니다.


INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'channels',
    'exam',
]
cs


settings.py 에 DATABASE 설정과 모양이 비슷한 설정을 넣어줍니다.


CHANNEL_LAYERS = {
    'default': {
        'BACKEND''asgi_redis.RedisChannelLayer',
        'ROUTING''exam.routing.channel_routing',
    }
}
cs


여기에 등록한대로 exam 앱에 routing.py를 만들어서 channel_routing을 만들어줍니다. 

그 전에 consumers.py는 이렇게 해줍니다. consumers.py는 exam앱 안에 위치시키는 것을 추천합니다.


from channels import Group
 
def ws_connect(message):
    Group('users').add(message.reply_channel)
 
def ws_disconnect(message):
    Group('users').discard(message.reply_channel)   
cs


그 다음에 routing.py를 만들어줘야 합니다. urls.py와 비슷한 역할을 수행합니다. websocket용 urls.py 라고 생각하시면 됩니다. 


from channels.routing import route
from exam.consumers import ws_connect, ws_disconnect
 
 
channel_routing = [
    route('websocket.connect', ws_connect),
    route('websocket.disconnect', ws_disconnect),
]   
cs


3. client에서 실행


이제 jquery를 이용해 websocket을 클라이언트에서 실행해줍니다. 클라이언트는 django 의 templates에 위치한 html 파일에서 동작합니다.


  <script>
    var socket = new WebSocket('ws://' + window.location.host + '/users/');
 
    socket.onopen = function open() {
      console.log('created.');
    };
 
    if (socket.readyState == WebSocket.OPEN) {
      socket.onopen();
    }
  </script>
cs


기본적인 설정이 끝났습니다. runserver 한 후 클라이언트 상에서 위 페이지에 접속하면 로그가 뜰 것입니다.


 WebSocket HANDSHAKING /users/
 WebSocket DISCONNECT /users/
cs


이런식으로 나오면 됩니다.

+ Recent posts