Gunicorn et webockets
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
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.