【问题标题】:Flask-SocketIO Not Working On Apache/WSGIFlask-SocketIO 在 Apache/WSGI 上不起作用
【发布时间】:2015-07-07 10:28:50
【问题描述】:

我使用了来自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 运行?

【问题讨论】:

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


    【解决方案1】:

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

    你正在阅读的教程状态

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

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

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

    所以,Gunicorn。来自the docs

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

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

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

    【讨论】:

    • uwsgi 也不适用于此扩展,因为它不允许使用自定义 gevent 循环。 Gunicorn 确实有效,命令在文档中。
    • 感谢您的信息。 Gunicorn 是我自己用的。
    • @Miguel 我认为可能是这样。我确实阅读了文档,但奇怪的是他们无法以某种方式通过 Apache 代理到 Flask 来处理 socketio。
    • @user4143585 是的,但问题是这超出了 wsgi 规范,这是 apache/uwsgi 实现的。
    猜你喜欢
    • 2018-07-27
    • 1970-01-01
    • 1970-01-01
    • 2011-07-12
    • 2015-04-10
    • 2013-05-03
    • 2020-04-05
    • 1970-01-01
    • 2019-03-16
    相关资源
    最近更新 更多