简体   繁体   English

gunicorn和websockets

[英]gunicorn and websockets

I'm trying to get http://www.gelens.org/code/gevent-websocket/ running and keep getting the following error. 我正在尝试运行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'

I'm running python 2.7.2 on Mint Linux 我在Mint Linux上运行python 2.7.2

used @bkad's code and added to main main app file 使用@ 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

to heder so that I wouldn't have to modify 3rd party libraries. 为了让我不必修改第三方库。

I get this same bug with gevent-websocket 0.3.4 and gevent 0.13.6 when running the gunicorn -k "geventwebsocket.gunicorn.workers.GeventWebSocketWorker" example:app example. 当运行gunicorn -k "geventwebsocket.gunicorn.workers.GeventWebSocketWorker" example:app时,我得到了与gevent-websocket 0.3.4和gevent 0.13.6相同的错误gunicorn -k "geventwebsocket.gunicorn.workers.GeventWebSocketWorker" example:app example。

The problem comes from a mismatch of expectations between gevent and gunicorn. 问题来自于gevent和gunicorn之间的期望不匹配。 Gevent's pywsgi module expects a logger object which implements a write method, like file objects, stdout, etc. Gunicorn, however, passes in an object which has Logger methods (debug, info, error, critical, warning, etc). Gevent的pywsgi模块需要一个实现write方法的logger对象,比如文件对象,stdout等。然而,Gunicorn传入一个具有Logger方法的对象(调试,信息,错误,关键,警告等)。

The problem code in pywsgi: pywsgi中的问题代码:

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

To fix this for myself, I hacked up the lines in a fork of gevent and changed them to the following: 为了解决这个问题,我在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')

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM