2015-04-28 63 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

相關問題