Question

J'essaye d'obtenir http://www.gelens.org/code/gevent-websocket/ Exécution et continuez à obtenir l'erreur suivante.

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'

J'exécute Python 2.7.2 sur Mint Linux

Était-ce utile?

La solution

J'obtiens ce même bug avec Gevent-Websocket 0.3.4 et Gevent 0.13.6 lors de l'exécution du gunicorn -k "geventwebsocket.gunicorn.workers.GeventWebSocketWorker" example:app Exemple.

Le problème vient d'un décalage des attentes entre Gevent et Gunicorn. Le module PyWSGI de Gevent s'attend à un objet d'enregistrement qui implémente un write La méthode, comme les objets de fichier, le stdout, etc. Gunicorn, cependant, passe dans un objet qui a Bûcheron Méthodes (débogage, informations, erreur, critique, avertissement, etc.).

Le code de problème dans Pywsgi:

def log_request(self):
    log = self.server.log
    if log:
        log.write(self.format_request() + '\n')

Pour résoudre ce problème par moi-même, j'ai piraté les lignes dans une fourche de gevent et les ai changées à ce qui suit:

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')

Autres conseils

Code d'occasion @ bkad et ajouté au fichier principal de l'application 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

à Heder afin de ne pas avoir à modifier les bibliothèques tierces.

Veuillez utiliser les dernières versions de Gevent et Gevent-Websocket sur PYPI.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top