我想得到 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-websocket 0.3.4 和 gevent 0.13.6 时,我遇到了同样的错误 gunicorn -k "geventwebsocket.gunicorn.workers.GeventWebSocketWorker" example:app 例子。

问题来自于 gevent 和 Gunicorn 之间的期望不匹配。Gevent 的 pywsgi 模块需要一个记录器对象,该对象实现 write 方法,如文件对象、stdout 等。然而,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')

其他提示

使用@ 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
.

到heder,以便我不必修改第三方库。

请在PYPI上使用最新版本的GEVENT和GEVENT-WebSocket。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top