Як подружити мікрофреймворк Bottle з веб-сокетами?

Будемо розглядати зв’язку nginx+gunicorn+bottle.

Підтримка перемикання протоколу, який необхідний для встановлення веб-сокет з’єднання, реалізована в nginx, починаючи з версії 1.3.13. Тому перевірте свою версію nginx і за необхідності оновіть його

1
2
$ nginx -v
nginx version: nginx/1.6.2

Далі дещо змінюємо nginx-конфігурацію для вашого додатку

1
2
3
4
5
6
location /websocket {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}

Тепер встановлюємо gevent-websocket - воркер, що буде використовуватися gunicorn-ом для забезпечення підтримки веб-сокетів в bottle

1
$ pip install gevent-websocket

В файлі налаштувань gunicorn додаємо рядок (повний файл налаштувань в цій статті)

1
worker_class = 'geventwebsocket.gunicorn.workers.GeventWebSocketWorker'

Додаємо функцію-обробник в bottle-коді

1
2
3
4
5
6
7
8
9
10
11
12
@app.route('/websocket')
def handle_websocket():
wsock = request.environ.get('wsgi.websocket')
if not wsock:
abort(400, 'Expected WebSocket request.')

while True:
try:
message = wsock.receive()
wsock.send('Your message %s' % message)
except WebSocketError:
break

І вбудовуємо в сторінку код, який буде спілкуватися з даним обробником

1
2
3
4
5
6
7
var ws = new WebSocket("ws://localhost:8080/websocket");
ws.onopen = function() {
ws.send("Hello, world");
};
ws.onmessage = function (evt) {
alert(evt.data);
};

Перезапускаємо все

1
2
3
4
$ supervisorctl projectname restart
$ supervisorctl projectname status
$ nginx -t
$ nginx -s reload

Заходимо на сторінку і бачимо інформаційне віконце з вашим текстом!

Ресурси