2012-02-25 8 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モジュールでは、ファイルオブジェクト、stdoutなどのwriteメソッドを実装するロガーオブジェクトが必要です。しかし、Gunicornは、メソッド(デバッグ、情報、エラー、クリティカル、警告など)を持つオブジェクトを渡します。

pywsgiで問題のコードは:

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

自分のためにこれを修正するために、私はgeventのフォークでラインをハッキングし、次にそれらを変更: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') 
+0

恐ろしい。ありがとう – wegrata

+0

違反コード:https://bitbucket.org/denis/gevent/src/5dca6e927bc4/gevent/pywsgi.py#cl-421 –

1

は、PyPI上geventとgevent-のWebSocketの最新バージョンを使用してください。

+0

私はpip install geventと一緒にインストールしました。 – wegrata

+0

私はgithubの最新版gevent 1.0devを使用しています。 – Stephan

8

私は変更する必要がないようにhederにメインメインアプリケーションファイルに

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」を実行する必要がありました。 –