Flask 和 Flask-SocketIO [重复]

Posted

技术标签:

【中文标题】Flask 和 Flask-SocketIO [重复]【英文标题】:Flask and Flask-SocketIO [duplicate] 【发布时间】:2016-04-19 03:38:29 【问题描述】:

这似乎是一个非常简单的问题,但它让我感到困惑,我有一个 Flask 应用程序,它提供一个网页并通过 Socket.io 与该页面通信。 Flask 应用程序如下所示:

app = Flask(__name__)
socketio = SocketIO(app)

@socketio.on_error()
def error_handler(e):
    print e

#this fires
@socketio.on("connect")
def connect():
    print "connected"

#this does not    
@socketio.on('test')
def test_handler(message):
    print "TEST WORKS"

if __name__ == "__main__":
    app.run(debug=True, host='0.0.0.0')
    socketio.run(app)

我的页面本身很简单:

<!doctype html>
<html>
  <head>
    <title>Flask Socket.IO test</title>
    <style>
      body  font: 13px Helvetica, Arial; 
    </style>

    <script src="socket.io-1.4.3.js"></script>
    <script src="jquery-2.2.0.min.js"></script>
    <script>
      var socket = io("192.168.42.1:5000");
        socket.on('connect', function() 
            console.log(" connected ");
        );
        $(document).ready( function() 
            $( '.startBtn' ).click(function() 
                console.log("ok");
                socket.emit('test', data:"start!");
            );
        );
    </script>

  </head>

  <body>
    <div class="startBtn">
        <h1>START</h1>
    </div>
  </body>
</html>

我看到双方都连接了(即双方都触发了连接事件),但没有收到我从页面发送到服务器的任何内容。我猜想我的东西配置错误,但正在建立的连接让我不这么认为。

【问题讨论】:

"test" 不是有效消息 ... socketio 接口只有“connect”、“disconnect”和“message” ...我认为...无论如何你需要一个 on_message 处理程序您解析出有关该做什么的其他信息... @JoranBeasley 有趣的是,Flask-SocketIO 文档显示:@socketio.on('my event') def handle_my_custom_event(json): 以及从 HTML 页面发送的相应消息:socket.emit('my event', data: 'I\'m connected!'); 所以我想我假设不称为“消息”的东西应该工作吗? 我会使用一个按钮,&lt;button id="startBtn"&gt;Click me!&lt;/button&gt;,然后是$('#startBtn').click(function() ... 。我不确定捕捉“START”文本的点击是否有效。 @J.J.Hakala 它在控制台上打印“ok”,据我所知,应该也执行下一行 是的,我知道......我花了一些时间搞砸这个(也许没有足够的时间),最后只使用了 on("message") 和 json.encoding 一个包含“my_custom_event”或其他内容的有效负载... 【参考方案1】:

所以问题似乎在于我如何设置 Flask 应用程序和 socketio。改成这样:

app = Flask(__name__)
socketio = SocketIO(app, async_mode='eventlet')

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


@socketio.on('test')
def josh_test(message):
    print "test"

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

它现在可以很好地工作,无需更改 HTML 文件。我以前的版本有:

if __name__ == "__main__":
   app.run(debug=True, host='0.0.0.0')
   socketio.run(app)

这就是造成问题的原因。

【讨论】:

以上是关于Flask 和 Flask-SocketIO [重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用flask和flask-socketio配置nginx、uwsgi

[翻译] flask-SocketIO

使用 Flask-socketio 和 socketIO 客户端

flask-SocketIO 和 eventlet 有问题

Flask-SocketIO发送图像

Flask-SocketIO 的发射函数线程安全吗?