Gunicorn und Websockets
Frage
Ich versuche es zu bekommen http://www.gelens.org/code/gevent-websocket/ läuft und es wird weiterhin die folgende Fehlermeldung angezeigt.
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'
Ich verwende Python 2.7.2 unter Mint Linux
Lösung
Ich bekomme den gleichen Fehler mit gevent-websocket 0.3.4 und gevent 0.13.6, wenn ich das ausführe gunicorn -k "geventwebsocket.gunicorn.workers.GeventWebSocketWorker" example:app
Beispiel.
Das Problem ergibt sich aus einem Missverhältnis der Erwartungen zwischen Gevent und Gunicorn.Das Pywsgi-Modul von Gevent erwartet ein Logger-Objekt, das a implementiert write
Methode, wie Dateiobjekte, stdout usw.Gunicorn übergibt jedoch ein Objekt, das dies getan hat Logger Methoden (Debug, Info, Fehler, Kritisch, Warnung usw.).
Der Problemcode in pywsgi:
def log_request(self):
log = self.server.log
if log:
log.write(self.format_request() + '\n')
Um das Problem für mich selbst zu beheben, habe ich die Zeilen in einem Gevent-Fork zerhackt und wie folgt geändert:
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')
Andere Tipps
@ BKAD-Code verwendet und zur Haupt-Haupt-App-Datei hinzugefügt generasacodicetagpre.
an Heerer, damit ich 3RD-Partei-Bibliotheken nicht ändern müsste.
Bitte verwenden Sie die neuesten Versionen von GEVENT und GEVENT-WebSocket auf PYPI.