Sto usando Flask insieme gevent-socketio:gevent-socketio non usando il mio @ app.route endpoint per socketio
$ cat requirements.txt
Flask==0.10.1
Jinja2==2.7.1
MarkupSafe==0.18
Werkzeug==0.9.3
argparse==1.2.1
gevent==0.13.8
gevent-socketio==0.3.5-rc2
gevent-websocket==0.3.6
greenlet==0.4.1
itsdangerous==0.23
wsgiref==0.1.2
sto usando una configurazione piuttosto standard per avviare il server:
#Called from __main__
def run_dev_server():
app.debug = True
port = 5000
dapp = werkzeug.debug.DebuggedApplication(app, evalex = True)
SocketIOServer(('', port), dapp, resource="socket.io").serve_forever()
e un gancio abbastanza standard per la mia SocketIO namespace:
@app.route('/socket.io/<path:rest>')
def push_stream(rest):
print 'ws connect', rest
try:
socketio.socketio_manage(request.environ, {'/join_notification': JoinsNamespace}, request)
except Exception as e:
app.logger.error("Exception while handling socketio connection", exc_info=True)
return flask.Response()
Tuttavia, sto avendo problemi in cui 'connect' ancora Non vengono licenziate sul client. Dopo un po 'di scavo, mi sono reso conto che anche se ricevevo i messaggi 127.0.0.1 - - [2013-08-19 12:53:57] "GET /socket.io/1/websocket/170191232666 HTTP/1.1" 101 - -
nell'output, non ricevevo il messaggio ws connect
(mentre altre dichiarazioni di stampa nel codice funzionavano correttamente). Ho commentato quell'endpoint, e abbastanza sicuro che non è nemmeno stato chiamato. Questo spiegherebbe perché il mio spazio dei nomi non viene utilizzato. Ma perché? Sto registrando il mio spazio dei nomi sbagliato?
print app.url_map
rendimenti:
Map([<Rule '/' (HEAD, OPTIONS, GET) -> root>,
<Rule '/socket.io/<rest>' (HEAD, OPTIONS, GET) -> push_stream>,
<Rule '/static/<filename>' (HEAD, OPTIONS, GET) -> static>])
quindi nulla di straordinario.
Edit: Il codice client:
socket = io.connect('/join_notification')
console.log(socket)
socket.on('connect', function() {
console.log('connected to websocket')
socket.emit('login', {'name': data['name']})
})
socket.on('disconnect', function() {
console.log('d/c\'d from websocket')
})
socket.on('join_error', function() {
...
})
socket.on('join_success', function(data){
...
})
socket.on('join', function(data) {
...
})
Inviare il codice client pure – leon
Aggiunto il codice client. – Rotten194
Se ricevi un /socket.io/1/ quando chiami Connetti, stai facendo qualcosa di sbagliato. Connect dovrebbe essere chiamato con un POST a /socket.io/1/. Omettendo il segmento successivo stai iniziando una nuova connessione.Quindi, ti sei collegato e riceverai una risposta con "roba" alla fine, il che significa che ha funzionato, oppure stai iniziando la connessione sbagliata. Ora, se funziona e non chiama il tuo codice, sei sicuro di aver inizializzato correttamente il tuo spazio dei nomi? https://gevent-socketio.readthedocs.org/en/latest/namespace.html –
blakev