【问题标题】:Invalid request block size when using SocketIO with Flask and uWSGI将 SocketIO 与 Flask 和 uWSGI 一起使用时请求块大小无效
【发布时间】:2015-04-25 03:13:48
【问题描述】:

我正在尝试使用 uWSGI 和 gevent 使用 SocketIO 运行 Flask 应用程序。

uwsgi --gevent 10 --socket :5000 --module run

但是,我收到以下错误:

invalid request block size: 21573 (max 4096)...skip

这是我的代码:

from gevent import monkey
monkey.patch_all()

from flask import Flask, render_template, session, request
from flask.ext.socketio import SocketIO, emit, disconnect

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

socketio = SocketIO(app)

@app.route('/')
def index():
    session['user'] = '1'
    return render_template('index.html', name='simon')

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

@socketio.on('connect', namespace='/test')
def test_connect():
    emit('my response', {'data': 'Connected %s' % session['user']})

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

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

【问题讨论】:

    标签: flask socket.io uwsgi gevent


    【解决方案1】:

    我的理解是 uWSGI 中的 gevent 支持不允许使用自定义的 gevent 服务器类,uWSGI 提供了自己的。不幸的是 gevent-socketio 需要自己的服务器,它是 gevent 的子类,所以我认为目前无法将 uWSGI 与 Flask-SocketIO 或 gevent-socketio 一起使用。

    请参阅Flask-SocketIO documentation 了解替代方案。

    【讨论】:

    • 感谢您的清晰解释。那么在我的 Flask 应用程序中只使用 gevent 模块而不是 Flask-SocketIO 并使用代理 nginx 呢?
    • 这可能可行,但您需要自己处理套接字通信,听起来工作量很大。使用 gunicorn+nginx 更容易。
    【解决方案2】:

    问题是您使用二进制uwsgi 协议,但通过http 协议访问您的服务器。尝试将--socket 替换为--http-socket。另见https://stackoverflow.com/a/32894820/179581

    【讨论】:

    • 这只会将错误消息更改为invalid HTTP request size (max 4096)...skip
    猜你喜欢
    • 2013-03-30
    • 2019-09-27
    • 1970-01-01
    • 2017-01-18
    • 2015-12-01
    • 2019-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多