[3] 장고 채널스(django chennals) urls를 기반으로 한 라우팅
Computer 비관심/Django2017. 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번 소켓도 같이 데이타를 받는 것을 볼 수 있다.
같은 소켓을 하나의 브라우저에서 두번 만드는 것도 가능하다.
'Computer 비관심 > Django' 카테고리의 다른 글
장고에서 폼 에러 찾기 (0) | 2017.03.03 |
---|---|
지금까지 하면서의 장고프레임웍의 장점과 단점 (0) | 2017.02.23 |
[4]장고 채널스(django channels) json 데이타 전송 (0) | 2017.02.18 |
[2] 장고 채널스(django chennals) Group (0) | 2017.02.17 |
[1] 장고 채널스(django channels) 웹소켓 에코 (2) | 2017.02.17 |
댓글()