2016-10-11 84 views
1

这是一个简单的代码片断,不断重复我遇到的问题。我使用Python 2.7.12,Flask 0.11,Flask-SocketIO 2.7.1和gevent 1.1.2。我知道这可能是一个更好的问题,可以提交给负责包裹的邮件列表,但我无法弄清楚哪一个负责。但是,我很确定这是gevent的问题,因为这引发了异常。为什么Flask + SocketIO + Gevent会给我SSL EOF错误?

from flask import Flask 
from flask_socketio import SocketIO 

from gevent import monkey 
monkey.patch_all() 

import ssl 

app = Flask(__name__) 
app.config['SECRET_KEY'] = 'secret' 

socketio = SocketIO(app, async_mode='gevent') 

@app.route('/') 
def index(): 
    return "Hello World!" 

@socketio.on('connect') 
def handle_connect_event(): 
    print('Client connected') 

if __name__ == '__main__': 
    socketio.run(app, host='127.0.0.1', port=8443, 
       certfile='ssl/server/server.cer', keyfile='ssl/server/server.key', 
       ca_certs='ssl/server/ca.cer', cert_reqs=ssl.CERT_REQUIRED, 
       ssl_version=ssl.PROTOCOL_TLSv1_2) 

这里是我得到当客户端连接错误:

Traceback (most recent call last): 
    File "/usr/lib/python2.7/site-packages/gevent/greenlet.py", line 534, in 
    result = self._run(*self.args, **self.kwargs) 
    File "/usr/lib/python2.7/site-packages/gevent/baseserver.py", line 25, in 
    return handle(*args_tuple) 
    File "/usr/lib/python2.7/site-packages/gevent/server.py", line 126, in wr 
    ssl_socket = self.wrap_socket(client_socket, **self.ssl_args) 
    File "/usr/lib/python2.7/site-packages/gevent/_sslgte279.py", line 691, i 
    ciphers=ciphers) 
    File "/usr/lib/python2.7/site-packages/gevent/_sslgte279.py", line 271, i 
    raise x 

    SSLEOFError: EOF occurred in violation of protocol (_ssl.c:590) 
    <Greenlet at 0x7fdd593c94b0: _handle_and_close_when_done(<bound method WSGInd method WSGIServer.do_close of <WSGIServer a, (<socket at 0x7fdd590f4410 SSLEOFError 

我的系统也有OpenSSL的版本1.0.2.j是否有帮助。任何想法,将不胜感激!

+0

这是之前向我报告的(请参阅https://github.com/miguelgrinberg/Flask-SocketIO/issues/88),但从未发现问题所在。这很可能是一个与gevent相关的bug。如果您有可以配置为终止SSL的代理服务器,您可能可以绕过此问题,因为我所链接的错误报告中的人员确实如此。 – Miguel

回答

0

在代码的顶部使用patch_all。甚至在烧瓶和烧杯进口之前。

from gevent import monkey 
monkey.patch_all() 

from flask import Flask 
from flask_socketio import SocketIO 

import ssl 
+0

这似乎没有帮助。 – smbullet

相关问题