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 |
이런식으로 나오면 됩니다.
'Python' 카테고리의 다른 글
[helloworld] for문 사용법 (0) | 2018.02.11 |
---|---|
[django] django form 사용법 (0) | 2018.02.11 |
[django] django에서 DoesNotExist와 인증 Backend 만들기 (0) | 2018.02.07 |
[django] django 에서 recaptcha 사용 (0) | 2018.02.05 |
[django] 간단한 웹 게임 프로그램 작성에 필요한 설정 (0) | 2018.02.04 |