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
如果有人对此有任何解决方案,将不胜感激。提前致谢。
这里需要考虑的几点:
- 打印到 stdout 的语句不一定会显示在 Flask 的输出中,我相信 stderr 会显示,因此您可能想尝试使用它或记录器,例如:
print('Connected!', file=sys.stderr)
app.logger.info("Connected!")
- 您确定您的客户端版本正确吗?我不相信客户端包含在 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>
- 浏览器中的 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>
有关详细信息,请参阅文档。
所以我正在构建一个使用 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
如果有人对此有任何解决方案,将不胜感激。提前致谢。
这里需要考虑的几点:
- 打印到 stdout 的语句不一定会显示在 Flask 的输出中,我相信 stderr 会显示,因此您可能想尝试使用它或记录器,例如:
print('Connected!', file=sys.stderr)
app.logger.info("Connected!")
- 您确定您的客户端版本正确吗?我不相信客户端包含在 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>
- 浏览器中的 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>
有关详细信息,请参阅文档。