Reputation: 1656
I'm trying to get http://www.gelens.org/code/gevent-websocket/ running and keep getting the following error.
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'
I'm running python 2.7.2 on Mint Linux
Upvotes: 3
Views: 5491
Reputation: 81
used @bkad's code and added to main main app file
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
to heder so that I wouldn't have to modify 3rd party libraries.
Upvotes: 8
Reputation: 46
I get this same bug with gevent-websocket 0.3.4 and gevent 0.13.6 when running the gunicorn -k "geventwebsocket.gunicorn.workers.GeventWebSocketWorker" example:app
example.
The problem comes from a mismatch of expectations between gevent and gunicorn. Gevent's pywsgi module expects a logger object which implements a write
method, like file objects, stdout, etc. Gunicorn, however, passes in an object which has Logger methods (debug, info, error, critical, warning, etc).
The problem code in pywsgi:
def log_request(self):
log = self.server.log
if log:
log.write(self.format_request() + '\n')
To fix this for myself, I hacked up the lines in a fork of gevent and changed them to the following:
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')
Upvotes: 3
Reputation: 47
Please use the latest versions of gevent and gevent-websocket on PyPi.
Upvotes: 1