2013-11-20 13 views
7

Sto cercando di utilizzare Flask-Sockets con il codice di esempio:Come usare le boccette? Ottenere un KeyError: 'wsgi.websocket'

sockets = Sockets(app) 

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

Purtroppo, quando semplicemente andando all'URL/eco usando il mio browser mi dà un errore che dice:

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' 

Qualcuno ha qualche idea su cosa sto facendo male? Tutti i suggerimenti sono ben accetti!

[EDIT] @jbub - Grazie per i suggerimenti! Quindi per iniziare ora uso gunicorn invece del dev-server integrato. Così l'ho iniziato usando gunicorn -k flask_sockets.worker -b 0.0.0.0:5000 main:app. Ho quindi inserito il codice qui sotto nel mio views.py in cui echo_test.html è il codice che hai fornito. Quando visito/echo_test, in effetti ricevo un prompt che dice "socket closed".

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') 

Ma diciamo che il mio obiettivo è quello di avere una parola (scelto a caso da una lista) su una pagina che viene aggiornata con altri valori scelti a caso dalla lista. Avresti qualche consiglio per raggiungerlo?

+1

Sei in esecuzione dietro qualsiasi server http? Avete installato libevent, gevent e gevent-websocket? – jbub

+1

@jbub - Sto eseguendo sia apache che il server di sviluppo di Flask. Ma per quanto ne so, non si mettono a vicenda. Tutte le altre cose che ho eseguito dal server Flask non hanno problemi. Inoltre, ho appena aggiunto alla domanda che sto semplicemente visitando l'url con il mio browser, suppongo che sia il modo di iniziare correttamente? Qualsiasi altro suggerimento è benvenuto dato che sono piuttosto disperato .. – kramer65

+0

Nota per altre persone che si imbattono in questo problema. Assicurati che la tua porta sia corretta. Nella maggior parte dei casi la porta dovrebbe essere 8000 NOT 5000. –

risposta

8

Ah, questo è il problema, non puoi semplicemente visitare l'endpoint websocket con la normale richiesta GET, in questo modo lo wsgi.websocket non sarà impostato su environ.

uso anche gunicorn non il server dev, si tratta con l'operaio preconfigurato:

# install from pip 
pip install gunicorn 

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

ho fatto ad esempio veloce qui, assicuratevi di aggiornare l'indirizzo e la porta per abbinare il vostro setup.

<!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> 

In questo modo il browser invia una richiesta al server, che indica che si vuole un cambio di protocollo da HTTP a WebSocket.

Sentitevi liberi di leggere alcuni di più su WebSockets qui:

+0

Grazie per i suggerimenti! Ora vedo l'avviso. Mi chiedo solo; come aggiorno qualcosa (come una parola) in modo da sostituirlo con nuovi valori? Qualche consiglio su questo? – kramer65

+0

se vuoi iniziare a inviare messaggi, sentiti libero di controllare questo esempio https://github.com/heroku-examples/python-websockets-chat/blob/master/chat.py, il suo basato su boccette-socket :) – jbub

+0

C'è un modo per farlo senza Gunicorn e solo fiasco? Sembra una seccatura per eseguire un altro processo. –

2

Sembra che Flask-prese di corrente non ha fornito un server socket in modo che sia necessario impostare nginx per proxy web socket, esegui la tua app usando gunicorn o crea un server socket tu stesso.

ho trovato questa utile https://gist.github.com/lrvick/1185629

1

Se si utilizza AWS, ho scoperto che a volte hanno bisogno di modificare il gruppo di protezione in modo che la porta 80 (e 443) sono di tipo 'Regola TCP su misura' e non HTTP (e HTTPS)

+0

Sto per essere distribuito su AWS, quindi grazie per il suggerimento! – kramer65