Flask-SocketIO无法在Apache / WSGI上运行

时间:2015-04-28 13:58:15

标签: python apache flask gevent-socketio flask-socketio

我使用了http://blog.miguelgrinberg.com/post/easy-websockets-with-flask-and-gevent/page/4中的以下示例代码,当我使用测试服务器运行它时,这样可以正常工作,例如python myapp.py我可以连接到它并发送消息

from flask import Flask, render_template
from flask.ext.socketio import SocketIO, emit

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

@app.route('/')
def index():
    return render_template('index.html')

@socketio.on('my event', namespace='/test')
def test_message(message):
    emit('my response', {'data': message['data']})

@socketio.on('my broadcast event', namespace='/test')
def test_message(message):
    emit('my response', {'data': message['data']}, broadcast=True)

@socketio.on('connect', namespace='/test')
def test_connect():
    emit('my response', {'data': 'Connected'})

@socketio.on('disconnect', namespace='/test')
def test_disconnect():
    print('Client disconnected')

if __name__ == '__main__':
    socketio.run(app)

问题是,当我将相同的代码移动到使用Apache来服务Flask的服务器时,我会收到错误。

RuntimeError: You need to use a gevent-socketio server.

Apache主机的配置文件是:

 WSGIApplicationGroup %{GLOBAL}
 WSGIScriptAlias / /var/www/public/flaskApp/flaskApp.wsgi

 <Location /var/www/public/flaskApp/flaskApp/>
    Order allow,deny
    Allow from all
</Location>

是否可以运行SocketIO / Flask并让它通过Apache工作?

1 个答案:

答案 0 :(得分:2)

Apache运行您的应用的 /var/www/public/flaskApp/flaskApp.wsgi 文件并未使用支持socketio的服务器。

您正在阅读的教程状态

  

扩展以通常的方式初始化,但为了简化服务器的启动,扩展提供了自定义run()方法。此方法启动gevent,唯一支持的Web服务器。使用gunicorn与gevent worker也应该工作。

uWSGI documentation有一个关于在gevent模式下运行的部分,但Miguel注释:

  

uwsgi也不能使用此扩展,因为它不允许使用自定义gevent循环。 Gunicorn确实有效,命令在文档中。

所以,Gunicorn。来自the docs

  

另一种方法是使用gunicorn作为web服务器,使用gevent-socketio提供的worker类。以这种方式启动服务器的命令行如下所示:

gunicorn --worker-class socketio.sgunicorn.GeventSocketIOWorker module:app

简而言之,确保您使用提供gevent worker的东西运行。