2012-02-25 5 views
3

Я пытаюсь запустить http://www.gelens.org/code/gevent-websocket/ и продолжать получать следующую ошибку.gunicorn и websockets

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' 

Я бегу питона 2.7.2 на Mint Linux

ответ

3

Я получаю эту ошибку с gevent-websocket 0.3.4 и gevent 0.13.6 при запуске примера gunicorn -k "geventwebsocket.gunicorn.workers.GeventWebSocketWorker" example:app.

Проблема возникает из-за несоответствия ожиданий между gevent и gunicorn. Модуль pywsgi от Gevent ожидает объект logger, который реализует метод write, например, файловые объекты, stdout и т. Д. Gunicorn, однако, передает объект, который имеет методы Logger (отладка, информация, ошибка, критическое, предупреждение и т. Д.).

Код Проблема в pywsgi:

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

Чтобы исправить это для себя, я изрубил линии в развилке GEvent и изменил их к следующему:

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

Awesome. Спасибо – wegrata

+0

Оскорбительный код: https://bitbucket.org/denis/gevent/src/5dca6e927bc4/gevent/pywsgi.py#cl-421 –

1

Пожалуйста, используйте последние версии GEvent и GEvent-WebSocket на PyPi.

+0

Я установил с pip install gevent. – wegrata

+0

Я использую gevent 1.0dev, последний из github, и вышеупомянутое исправление работает для меня. – Stephan

8

используется @ bkad годов код и добавлено в основной файл основного приложения

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 

для того, чтобы мне не пришлось изменять Сторонние библиотеки.

+0

Мне нужно было сделать «import gevent.pywsgi», чтобы заставить это работать. –