Flask-SocketIO 运行 应用程序但未触发事件

Flask-SocketIO running app but not firing events

所以我正在构建一个使用 Flask 会话 ID 的简单 Flask 社交媒体应用程序。我想在用户离开页面时删除用户的会话 ID,以便他们必须重新登录。我做了一些研究,发现 Flask-SocketIO 允许您通过 'connect' 和 'disconnect' 事件来做到这一点。但是,当我 运行 应用程序并在页面上打开 site/log 时,没有任何反应。当我关闭选项卡时,我没有从连接事件或断开连接事件中获得任何输出。这是完整的代码。

# Starting/Initialisation of App
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///app.db'
app.config['DEBUG'] = True
app.config['SECRET_KEY'] = SECRET_KEY
socket_io = SocketIO(app=app, logger=True, engineio_logger=True)
db = SQLAlchemy(app)

# Socket IO Events
@socket_io.on('connect')
def on_connect():
    print("Connected!")

@socket_io.on('disconnect')
def on_disconnect():
    # TODO Fix this socket io disconnect event. It's not working for some reason. Just figure things out with socketio
    print("Client Disconnected")
    print("YOOOOOOOOOO")
    session.pop('id')

@socket_io.on('message')
def on_message():
    print("Exit message")

# App Routes
# A page where a user can login to an account
@app.route('/', methods=['GET', 'POST'])
def index():
    # If user submits form
    if request.method == "POST":
        # Get response and user's Account object from db
        # if query does not return None aka user is in database
        # Check if response's password is the same as the user's password
        # If it is, redirect to homepage
        # Else if not, return an "invalid password" error

        form = request.form # User Response
        user = Account.query.filter_by(email=str(request.form['email'])).first() # Query for user

        if user is not None: # Validating query
            if str(form['password']) == user.password: # Checking password
                session['id'] = user.id
                return redirect('/home')
            else:
                return "Invalid password"
        else:
            return "Invalid email or password"
    else:
        return render_template('index.html')

# Run App
if __name__ == '__main__':
    socket_io.run(app)

我没有收到任何错误,所以我真的很困惑。

下面是我的pip freeze

bidict==0.21.2
click==8.0.1
colorama==0.4.4
Flask==2.0.1
Flask-SocketIO==5.1.0
Flask-SQLAlchemy==2.5.1
greenlet==1.1.0
h11==0.12.0
itsdangerous==2.0.1
Jinja2==3.0.1
MarkupSafe==2.0.1
python-engineio==4.2.0
python-socketio==5.3.0
simple-websocket==0.2.0
SQLAlchemy==1.4.22
Werkzeug==2.0.1
wsproto==1.0.0

如果有人对此有任何解决方案,将不胜感激。提前致谢。

这里需要考虑的几点:

  1. 打印到 stdout 的语句不一定会显示在 Flask 的输出中,我相信 stderr 会显示,因此您可能想尝试使用它或记录器,例如:
print('Connected!', file=sys.stderr)
app.logger.info("Connected!")
  1. 您确定您的客户端版本正确吗?我不相信客户端包含在 Flask-SocketIO 中,并且 Flask-SocketIO 与最新的客户端版本 (4) 不兼容。您应该使用客户端版本 3.1.3 (https://socket.io/docs/v3/)。这是您包含的 SocketIO 库的版本(此示例从上述 SocketIO 文档中截取并更新为在连接后显示警告框,以便您确定它是否有效):
<html>
<body>
...
<script src="https://cdn.socket.io/3.1.3/socket.io.min.js" integrity="sha384-cPwlPLvBTa3sKAg    ddT6krw0cJat7egBga3DJepJyrLl4Q9/5WLra3rrnMcyTyOnh" crossorigin="anonymous"></script>
<script type='text/javascript'>
const socket = io("ws://localhost:5000");

socket.on("connect", () => {
  // either with send()
  alert("You're connected!");
  socket.send("Hello!");

  // or with emit() and custom event names
  socket.emit("salutations", "Hello!", { "mr": "john" }, Uint8Array.from([1, 2, 3, 4]));
});
</script>
</body>
</html>
  1. 浏览器中的 Web 控制台是否显示任何错误?您确定客户端代码正确并且您已连接吗? 查看 Javascript 控制台因浏览器而异,但会向您显示在 Javascript 中遇到的任何错误。例如,在 Chrome 中,您单击地址栏最右侧的 3 个点,然后单击更多工具 -> 开发人员工具。这对于调试 Javascript 问题至关重要。

您确定在 html 中的客户端方式中包含了 socket.io 吗?您可以将此脚本包含在 html 中以包含它。

<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/4.0.1/socket.io.js" integrity="sha512-q/dWJ3kcmjBLU4Qc47E4A9kTB4m3wuTY7vkFJDTZKjTs8jhyGQnaUrxa0Ytd0ssMZhbNua9hE+E7Qv1j+DyZwA==" crossorigin="anonymous" defer></script>

然后你需要在你的 javascript 文件或脚本标签中定义套接字。

<script type="text/javascript">
    socket = io.connect(document.href );
    socket.on('connect', function() {
        // do something when user connects
  });
  socket.emit("message",data) // data is sent to flask
</script>

有关详细信息,请参阅文档。

https://flask-socketio.readthedocs.io/en/latest/