2013-11-20 4 views
7

Я пытаюсь использовать Flask-Sockets с примерами кода:Как использовать колбу-розетки? Получение исключение KeyError: «wsgi.websocket»

sockets = Sockets(app) 

@sockets.route('/echo') 
def echo_socket(ws): 
    while True: 
     message = ws.receive() 
     ws.send(message) 

К сожалению, когда просто идти к URL/эхо с помощью моего браузера он дает мне ошибку, говоря:

File "/Library/Python/2.7/site-packages/Flask-0.10-py2.7.egg/flask/app.py", line 1836, in __call__ 
return self.wsgi_app(environ, start_response) 
File "/Library/Python/2.7/site-packages/flask_sockets.py", line 37, in __call__ 
environment = environ['wsgi.websocket'] 
KeyError: 'wsgi.websocket' 

У кого-нибудь есть идеи, что я делаю неправильно? Все советы приветствуются!

[EDIT] @jbub - Спасибо за советы! Поэтому для начала я теперь использую gunicorn вместо встроенного dev-сервера. Поэтому я начал с gunicorn -k flask_sockets.worker -b 0.0.0.0:5000 main:app. Затем я вставил код ниже в мои view.py i, где echo_test.html - это код, который вы указали. Когда я сейчас посещу/echo_test, я действительно получаю подсказку, говоря «сокет закрыт».

sockets = Sockets(app) 

@sockets.route('/echo') 
def echo_socket(ws): 
    while True: 
     message = ws.receive() 
     ws.send(message) 

@app.route('/echo_test', methods=['GET']) 
def echo_test(): 
    return render_template('echo_test.html') 

Но давайте сказать, что моя цель состоит в том, чтобы иметь слово (случайно выбранные из списка) на странице, которая обновляется с другими значениями выбранных случайным образом из списка. У вас есть какие-либо советы по достижению этого?

+1

Вы работаете за любым HTTP-сервером? У вас установлены libevent, gevent и gevent-websocket? – jbub

+1

@jbub - Я запускаю оба apache и Dev-сервера Flask. Но, насколько я знаю, они не попадают друг в друга. Все другие вещи, которые я запускаю с сервера Flask, не имеют проблем. Кроме того, я просто добавил к вопросу, что я просто посещаю URL-адрес с моим браузером, я полагаю, что это способ начать правильно? Любые другие советы приветствуются, так как я довольно отчаянный. – kramer65

+0

Примечание для других людей, столкнувшихся с этой проблемой. Убедитесь, что ваш порт правильно. В большинстве случаев порт должен быть 8000 NOT 5000. –

ответ

8

А, это проблема, вы не можете просто посетить конечную точку websocket с регулярным запросом GET, таким образом, wsgi.websocket не будет установлен в окружение.

Также используйте gunicorn не сервер разработчика, он поставляется с предварительно настроенным рабочим:

# install from pip 
pip install gunicorn 

# run app located in test.py module (in test.py directory) 
gunicorn -k flask_sockets.worker test:app 

Я сделал быстрый пример здесь, не забудьте обновить адрес и порт, чтобы соответствовать вашей настройке.

<!DOCTYPE html> 
<html> 
    <head> 
    <script type="text/javascript"> 
     var ws = new WebSocket("ws://localhost:8000/echo"); 
     ws.onopen = function() { 
      ws.send("socket open"); 
     }; 
     ws.onclose = function(evt) { 
      alert("socket closed"); 
     }; 
    </script> 
    </head> 
</html> 

Таким образом браузер отправляет запрос на сервер, указывая, что он хочет переключать протоколы с HTTP на WebSocket.

Вы можете прочитать некоторые больше о WebSockets здесь:

+0

Спасибо за советы! Теперь я вижу предупреждение. Мне просто интересно; как мне что-то обновить (например, слово), чтобы заменить его новыми значениями? Какие-нибудь советы по этому поводу? – kramer65

+0

, если вы хотите начать отправку сообщений, не стесняйтесь проверить этот пример на странице https://github.com/heroku-examples/python-websockets-chat/blob/master/chat.py, на основе флеш-сокетов :) – jbub

+0

Есть ли способ сделать это без Gunicorn и только в колбе? Похоже, хлопот, чтобы запустить другой процесс. –

2

Кажется, что Колба-Sockets не предусмотрен сокет-сервер, так что вы должны либо установить nginx в прокси-серверы, запустите приложение с помощью gunicorn или создайте сервер сокетов самостоятельно.

Я нашел это полезным https://gist.github.com/lrvick/1185629

1

При использовании АМС, я обнаружил, что иногда нужно изменить группу безопасности таким образом, что порт 80 (и 443) имеют тип «Пользовательские TCP Правило», а не HTTP (и HTTPS)

+0

Я собираюсь развернуть на AWS, так что спасибо за подсказку! – kramer65