2012-02-25 49 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' 

我對薄荷Linux上運行的Python 2.7.2

回答

3

運行gunicorn -k "geventwebsocket.gunicorn.workers.GeventWebSocketWorker" example:app示例時,我得到了與gevent-websocket 0.3.4和gevent 0.13.6相同的錯誤。

問題來自gevent和gunicorn之間的期望不匹配。 Gevent的pywsgi模塊需要一個實現了write方法的記錄器對象,例如文件對象,標準輸出等。然而,Gunicorn傳入一個包含方法(調試,信息,錯誤,關鍵,警告等)的對象。

問題代碼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

太棒了。謝謝 – wegrata 2012-04-22 23:27:23

+0

違規代碼:https://bitbucket.org/denis/gevent/src/5dca6e927bc4/gevent/pywsgi.py#cl-421 – 2012-05-17 15:45:54

1

請使用GEVENT和GEVENT-的WebSocket PyPI上的最新版本。

+0

我安裝了pip install gevent。 – wegrata 2012-02-26 17:26:27

+0

我使用github的gevent 1.0dev最新版本,上面的修補程序適用於我。 – Stephan 2012-12-11 13:14:36

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

我不得不做「導入gevent.pywsgi」才能使這個工作。 – 2013-01-17 21:35:03