Подтвердить что ты не робот

Бутылка + WebSocket

Можно ли разместить обычное приложение для бутылок и приложение WebSocket (пример: https://github.com/defnull/bottle/blob/master/docs/async.rst) в том же приложении (тот же порт)? Таким образом, /ws перейдет к обработчику WebSocket, и все остальные будут обычно перенаправляться другим обработчикам бутылок.

4b9b3361

Ответ 1

Конечно.

Сервер:

#!/usr/bin/python

import json
from bottle import route, run, request, abort, Bottle ,static_file
from pymongo import Connection
from gevent import monkey; monkey.patch_all()
from time import sleep

app = Bottle()

@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 was: %r" % message)
            sleep(3)
            wsock.send("Your message was: %r" % message)
        except WebSocketError:
            break

@app.route('/<filename:path>')
def send_html(filename):
    return static_file(filename, root='./static', mimetype='text/html')


from gevent.pywsgi import WSGIServer
from geventwebsocket import WebSocketHandler, WebSocketError

host = "127.0.0.1"
port = 8080

server = WSGIServer((host, port), app,
                    handler_class=WebSocketHandler)
print "access @ http://%s:%s/websocket.html" % (host,port)
server.serve_forever()

Страница html, содержащая javascript:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <script type="text/javascript">
    var ws = new WebSocket("ws://localhost:8080/websocket");
    ws.onopen = function() {
        ws.send("Hello, world");
    };
    ws.onmessage = function (evt) {
        alert(evt.data);
    };
  </script>
</head>
<body>
</body>
</html>

Клиент:

#!/usr/bin/python

from websocket import create_connection
ws = create_connection("ws://localhost:8080/websocket")
print "Sending 'Hello, World'..."
ws.send("Hello, World")
print "Sent"
print "Reeiving..."
result =  ws.recv()
print "Received '%s'" % result
ws.close()

Ответ 2

Это, скорее всего, не самый легкий ответ, но я только что закончил настройку тестовой среды, которая работает с использованием Nginx и uWSGI поверх Pyramid, и как только вы ее настроите, вы можете расширить ее очень легко, например, если ваш /ws вытягивает слишком много ресурсов, тривиально с Nginx + uWSGI, чтобы переместить /ws на другое оборудование. Мой фон - Pyramid, и мой опыт uWSGI был только с тестированием, но в моем чтении это решение, которое должно работать хорошо. Инструкции для бутылок были результатом быстрого поиска в Google.

Концепция:

Концепция заключается в том, чтобы выполнить ваше приложение, т.е. app = make_wsgi_app.from_config (config), перед вызовом app.serve_forever() и вместо этого использовать uwsgi для "обслуживания" вашего приложения к сокету app1.sock. Существует множество способов настройки uWSGI. На веб-сайте uWSGI имеется документация, позволяющая настроить uWSGI для работы с вашим приложением. Nginx поставляется с конфигурацией для использования сокетов uWSGI изначально, по крайней мере, в текущей версии. Вы просто передаете путь uwsgi_pass unix:///tmp/app1.sock; к конфигурации сайтов вместе с параметрами. Сделайте это дважды в одном и том же файле conf conf, один раз для location/{ и один раз для location/ws { , указывая на соответствующие файлы для файлов приложений, и вам должно быть хорошо идти,

Концепция обслуживания приложения к сокету как файла была для меня новой, когда я настраивал среду тестирования, надеюсь, это поможет.

Что получить:

Nginx
uWSGI

HowTo:

Извлеките информацию о настройке nginx и uwsgi из данного руководства и разместите ее в своем приложении здесь для конкретной бутылки настроить или перейти на сайт uwsgi и проверить их инструкции по настройке. Документация для каждой конкретной технологии довольно хороша, поэтому даже при отсутствии комбинированных примеров нетрудно заставить их работать вместе. С Nginx и uWSGI существует огромное количество настроек конфигурации, поэтому обязательно посмотрите на них.