微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

尽管使用 socketio.run(),“Flask-SocketIO 正在 Werkzeug 下运行”

如何解决尽管使用 socketio.run(),“Flask-SocketIO 正在 Werkzeug 下运行”

尽管使用了 socketio.run(),但我在使用 Eventlet 运行 Flask 和 SocketIO 时遇到了问题,我们不胜感激。我目前使用的是 Python 3.9,我已经尝试了每个模块的多个不同版本,但都无济于事。

[2021-04-04 06:39:05,709] WARNING in __init__: Flask-SocketIO is Running under Werkzeug,WebSocket is not available.
"GET /socket.io/?EIO=4&transport=websocket HTTP/1.1" 400 -

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <Meta charset="UTF-8">
    <title>SAR</title>
    <script src="https://cdn.socket.io/3.1.3/socket.io.min.js" integrity="sha384-cPwlPLvBTa3sKAgddT6krw0cJat7egBga3DJepJyrLl4Q9/5WLra3rrnMcyTyOnh" crossorigin="anonymous"></script>
</head>
<body>

<button id="ping" onclick="send()">ping</button>

<script>
    var socket = io.connect("http://" + document.domain + ":" + location.port,{transports: ['websocket']});

    socket.on("connect",function(){
        socket.emit("ping","Established a connection,pinging!");
    });

    socket.on("pong",function(response){
        console.log(response)
    });

    function send(){
        socket.emit("ping","ping_data");
    }
</script>

</body>
</html>

app.py

from flask import Flask,render_template
from flask_socketio import SocketIO,emit
import eventlet

app = Flask(__name__)
socketio = SocketIO(app,logger=True)

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

def receivedCallback():
  print('Pong received by user!')

@socketio.on( 'ping' )
def handle_ping(data):
  print("received",data)
  socketio.emit('pong',"pong_data",callback=receivedCallback)

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

解决方法

似乎通过终端运行我的主文件解决了这个问题。如果有人知道这是为什么,请分享,谢谢。 :)

python app.py

,

粗略地说明为什么它与 python app.py 一起运行是 if __name__ == '__main__' 仅在它通过终端运行时才执行,就像 main 函数首先被调用一样直接从终端运行时,在许多其他编程语言(如 Java 或 C)中。

当通过 Werkzeug 运行 Flask 应用程序时,Flask 应用程序实例被导入并被 Werkzeug 封装到一个模块中,请求被路由到该模块中。 (这就是为什么 if __name__ == __main__ 部分永远不会被执行——就像你在你的代码中导入另一个模块一样,那个模块的主函数永远不会被调用。)所以,据我所知,当你运行你的Flask 应用程序通过 Werkzeug,默认情况下通过 HTTP 接收和路由请求,而不是通过运行 socketio.run() 时 Flask-SocketIO 使用的 WebSocket 协议。 WebSocket 协议要求套接字始终处于打开状态,从而启用无法在 HTTP 中工作的异步 I/O,因为它是客户端-服务器协议。

然而,我没有关于如何通过 Werkzeug 解决问题和使用 Flask-SocketIO 的答案,但我希望上面的解释能对您的问题有所了解,并引导您朝着正确的方向前进。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。