GunicornとWebSockets
質問
http://www.gelens.org/code/gevent-websocket / 実行し、次のエラーが発生し続けます。
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'
.
MINT Linux でPython 2.7.2を実行しています。
解決
GEVENT-WEBSOSTOCKODE 0.3.4とGEVENT 0.13.6でこれと同じバグを取得します。
問題は、GeventとGunicornの間の期待の不一致から来ています。GeventのPywsgiモジュールは、ファイルオブジェクト、STDOUTなどのGunicornなどのgunicorn -k "geventwebsocket.gunicorn.workers.GeventWebSocketWorker" example:app
メソッドを実装するロガーオブジェクトを期待していますが、 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')
. 他のヒント
@ 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
.
ヘディアには、サードパーティのライブラリを修正する必要がないように。
PypiのGeventとGevent-WebSocketの最新バージョンを使用してください。
所属していません StackOverflow