Gunicorn e webscheets.
Domanda
Sto cercando di ottenere http://www.gelens.org/code/gevent-WebSocket / in esecuzione e continua a ottenere il seguente errore.
socket_id=1 already closed.
result = self._run(*self.args, **self.kwargs)
File "/home/walt/virtualenv/ws/local/lib/python2.7/site-packages/gevent/pywsgi.py", line 571, in handle
handler.handle()
File "/home/walt/virtualenv/ws/local/lib/python2.7/site-packages/gevent/pywsgi.py", line 180, in handle
result = self.handle_one_request()
File "/home/walt/virtualenv/ws/local/lib/python2.7/site-packages/gevent/pywsgi.py", line 314, in handle_one_request
self.handle_one_response()
File "/home/walt/virtualenv/ws/local/lib/python2.7/site-packages/geventwebsocket/handler.py", line 26, in handle_one_response
return self._handle_websocket()
File "/home/walt/virtualenv/ws/local/lib/python2.7/site-packages/geventwebsocket/handler.py", line 50, in _handle_websocket
self.log_request()
File "/home/walt/virtualenv/ws/local/lib/python2.7/site-packages/gevent/pywsgi.py", line 394, in log_request
log.write(self.format_request() + '\n')
AttributeError: 'Logger' object has no attribute 'write'
.
Sto eseguendo Python 2.7.2 su Mint Linux
Soluzione
ottengo lo stesso bug con Gevent-WebSocket 0.3.4 e Gevent 0.13.6 quando si esegue l'esempio gunicorn -k "geventwebsocket.gunicorn.workers.GeventWebSocketWorker" example:app
.
Il problema deriva da un disallineamento delle aspettative tra Gevent e Gunicorn.Il modulo PYSWSGI di Gevent si aspetta un oggetto logger che implementa un metodo write
, come oggetti file, stdout, ecc. Gunicorn, tuttavia, passa in un oggetto che ha logger metodi (debug, info, errore, critico, avviso, ecc.).
Il codice problematico in PYSGI:
def log_request(self):
log = self.server.log
if log:
log.write(self.format_request() + '\n')
.
Per risolvere questo per me stesso, ho violato le linee in una forchetta di Gevent e li ha cambiati a quanto segue:
def log_request(self):
log = self.server.log
if log:
if hasattr(log, "info"):
log.info(self.format_request() + '\n')
else:
log.write(self.format_request() + '\n')
. Altri suggerimenti
Utilizzato il codice BKAD e aggiunto al file principale principale principale
def log_request(self):
log = self.server.log
if log:
if hasattr(log, "info"):
log.info(self.format_request() + '\n')
else:
log.write(self.format_request() + '\n')
import gevent
gevent.pywsgi.WSGIHandler.log_request = log_request
.
ad Heder in modo che non avrei dovuto modificare le librerie di terze parti.
Si prega di utilizzare le ultime versioni di Gevent e Gevent-Websocket su Pypi.