SSAMKO의 개발 이야기

Django에서 socket-io[client] 사용하기 | Python 본문

Python

Django에서 socket-io[client] 사용하기 | Python

SSAMKO 2020. 6. 28. 17:23
반응형

vue.js - node.js 에 django 끼워넣기

1. Django에서 socket-io[client] 연결

2. Django - DB서버(mariaDB) 연결
3. Django - GCS(Google-Cloud-Storage) 연결

4. node.js(javascript) 와 django(python) JSON response 통일시키기

5. API cors(csrf) 설정

 

시작

현재 회사에서 Backend(node.js) - Frontend(vue.js) 로 만들어진 웹사이트에 새로운 기능을 런칭하면서,

해당 기능을 django로 제공하고자 했다. 

 

그래서 vue.js로 만들어진 페이지에 백엔드는 node.js, django 두 가지 서버가 운영되게 되었는데 내가 django서버 개발을 담당했다.

처음부터 vue와 django연결이라면 어느정도 내가 원하는 방식으로 진행할 수 있었겠지만,

기존에 만들어진 vue를 최대한 변경하지 않으면서(변경이 어려웠으므로) 

기존에 vue가 node와 통신하던 방식을 django에도 그대로 적용해야 했다.

 

그래서 먼저 1. node와 vue의 접점을 분석하고,

2.해당 기능들을 django에서 구현하는 방식으로 일을 진행했다.

 

Django에서 socket-io[client] 연결

현재 웹사이트의 아키텍쳐는 event-bus를 통해 각 서버들이 비동기적으로 연동되어 있다.

따라서 node와 vue도 event-bus를 통해 socket message를 주고 받으면서 일을 처리하고 있었다.

 

현재 어떤 메세지를, 어떤 상황에서, 어떤 형태로 주고 받는 지 파악하고,

django로 그대로 구현하기만 하면 간단할 것이라고 생각했다.

 

그런데 현 상태 파악이 끝난 후, django로 socket-io를 다루려고 하면서 문제가 발생했다.

 

django socket-io관련 패키지가 사용불가(out of date)된 지 오래된 것이었다.

그래서 django의 websocket을 이요해서 구현해야 하나 싶어, socket-io와 통신하는 방법을 이리저리 연구해봤으나

websocket으로 socket-io수신은 가능했지만 송신이 불가능했다. 

 

해결 - python-socketio[client]

머리를 싸매고 고민하던 찰나에 해결책이 너무도 쉽게 나왔다.

django가 아니라 Python 패키지를 이용하면 되는 것이었다.

현재 socket-io server는 event-bus 서버가 담당하고 있으므로,

django는 client역할만 하면 되었으므로, python-socketio[client]라는 client 전용 패키지를 사용했다.

 

설치

pip install "python-socketio[client]"

패키지 설치를 해주고,

연결

import socketio

sio = socketio.Client()
sio.connect('http://localhost:5000')

client를 생성하고, socket-io server와 연결해준다.

 

메세지 수신

@sio.event
def message(data):
    print('I received a message!')

@sio.on('my message')
def on_message(data):
    print('I received a message!')

메세지를 수신하는 방법은 두 가지가 있다.

@sio.event는 함수명(message)으로 오는 event message를 수신한다.

@sio.on('my message')는 'my message'라고 오는 event message를 수신한다. 이 방법은 함수명으로 지정할 수 없는(공백이 포함되거나 숫자로 시작하는 등)event 명을 다룰 때 사용된다.

 

메세지 송신

sio.emit('my message', {'foo': 'bar'})

메세지 송신은 emit함수를 이요한다. 'my message'는 event명이 되고, {'foo':'bar'}는 message가 된다.

 

참고: python-socketio package 공식 문서 
반응형
Comments