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

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top