[3] 장고 채널스(django chennals) urls를 기반으로 한 라우팅

Computer 비관심/Django|2017. 2. 17. 15:48
반응형

우리가 이전에 만든 route에 path 를 다음과 같이 추가한합니다.

그러면 url로 consumers.ws_add를 실행 할 수 있다. 이것은 인자를 ws_add로 넘기는 방법은 urls.py 에서 한 방법과 같습니다.

# routing.py

channel_routing = [
    ...
    route('websocket.connect', 'chat.consumers.ws_add',
          path=r'^/chat/(?P<room>\w+)$'),
]

consumers.py를 수정합니다. channel_session을 불러오고 @channel_session 데코레이터를 붙이면 장고 세션처럼 사용할 수 있는 message.channel_session을 제공합니다.

아래코드에서는 소켓접속시 room이라는 인자를 전달받아 'chat-전달받은 인자' 방을 만들고 

message.channel_session['room'] = room으로 세션을 저장하고 메시지가 전달되면 저장된 세션을 가져와 chat-인자 방에 send해줍니다.


# consumers.py

from channels import Group
from channels.sessions import channel_session


@channel_session
def ws_add(message, room):
    Group('chat-%s' % room).add(message.reply_channel)
    message.channel_session['room'] = room


@channel_session
def ws_echo(message):
    room = message.channel_session['room']
    Group('chat-%s' % room).send({
        'text': message.content['text'],
    })

테스트로 브라우저를 열고 소켓 객체를 생성해봅니다.


// 소켓생성
var ws1 = new WebSocket((window.location.protocol == 'http:' ? 'ws://' : 'wss://') + window.location.host + '/chat/' + 1) // 아이디 생성 ws1.id = 1; // 메시지가 오면 콘솔에 출력하도록 함. ws1.onmessage = function(message) { console.log('W' + this.id + ': ' + message.data); }

다른 브라우저에

// 소켓생성
var ws2 = new WebSocket((window.location.protocol == 'http:' ? 'ws://' : 'wss://') + window.location.host + '/chat/' + 2) // 아이디 생성 ws2.id = 2; // 메시지가 오면 콘솔에 출력하도록 함. ws2.onmessage = function(message) { console.log('W' + this.id + ': ' + message.data); }

또 다른 브라우저에 

// 소켓생성
var ws3 = new WebSocket((window.location.protocol == 'http:' ? 'ws://' : 'wss://') + window.location.host + '/chat/' + 2) // 아이디 생성 ws3.id = 3; // 메시지가 오면 콘솔에 출력하도록 함. ws3.onmessage = function(message) { console.log('W' + this.id + ': ' + message.data); }


결과


1번 브라우저

ws1.send를 할때 자기 /chat/1 그룹으로 등록한 사람에게만 보냈다. 1번 소켓 하나만 등록음. 


2번 브라우저



3번 브라우저


2번 소켓 3번 소켓은 chat/2 그룹으로 등록하여 2번 소켓이 send를 했을때 3번 소켓도 같이 데이타를 받는 것을 볼 수 있다.



같은 소켓을 하나의 브라우저에서 두번 만드는 것도 가능하다.


댓글()