2015-04-28 97 views
2

我已经使用了http://blog.miguelgrinberg.com/post/easy-websockets-with-flask-and-gevent/page/4中的以下示例代码,并且在我使用测试服务器运行它时工作正常。 python myapp.py我可以连接到它,并发送邮件Flask-SocketIO不能在Apache/WSGI上工作

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的服务瓶,我得到错误的服务器。

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 /瓶,并将它通过Apache的工作?

回答

2

您的/var/www/public/flaskApp/flaskApp.wsgi Apache正在运行您的应用程序的文件不使用支持socketio的服务器。

您正在阅读本教程状态

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

uWSGI documentation对在GEVENT模式下运行的部分,但Miguel评论:

uwsgi没有与此扩展擦出火花,因为它不允许使用自定义GEVENT循环。 Gunicorn确实有效,命令在文档中。

因此,Gunicorn。从the docs

另一种方法是使用gunicorn作为web服务器,使用GEVENT-socketio提供的工人阶级。启动这样的服务器,命令行如下所示:

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

总之,要确保你的东西,提供GEVENT工人运行。

+1

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

+0

感谢您的信息。 Gunicorn是我自己使用的。 – Celeo

+0

@Miguel我认为可能是这种情况。我确实阅读过文档,但看起来很奇怪,他们没有办法通过Apache代理通过Flask来处理socketio。 – user4143585