Gunicorn和WebSockets

3

我正在尝试运行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。

3个回答

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

为了避免修改第三方库,我希望您可以修改标题。

3
我在运行示例 gunicorn -k "geventwebsocket.gunicorn.workers.GeventWebSocketWorker" example:app 时,遇到了与 gevent-websocket 0.3.4 和 gevent 0.13.6 相同的错误。
问题出在 gevent 和 gunicorn 之间的期望不匹配。Gevent 的 pywsgi 模块期望一个实现了 write 方法的记录器对象,例如文件对象、标准输出等等。然而,Gunicorn 传递了一个具有 Logger 方法(debug、info、error、critical、warning 等)的对象。 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')

冒犯代码:https://bitbucket.org/denis/gevent/src/5dca6e927bc4/gevent/pywsgi.py#cl-421 - Neil Albrock

1
请在PyPi上使用最新版本的gevent和gevent-websocket。

我使用pip install gevent安装了gevent。 - wegrata
我正在使用来自Github的gevent 1.0dev最新版本,上述修复方法对我有效。 - Stephan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接