你如何让 Flask-SocketIO 改变 Flask 存储在 cookie 中的客户端会话?
How do you get Flask-SocketIO to alter the client's session stored in a cookie by Flask?
基本上,我想做的是在用户离开 website/close 标签页时删除他们的会话 ID,因为我希望他们每次访问该站点时都重新登录。我从其他 Stack Overflow 问题中听说我应该尝试 Flask-SocketIO 扩展,并使用断开连接事件来检测他们何时离开网站,然后从会话中弹出他们的 ID。所以这正是我所做的,但是,每当我弹出会话时,它实际上并没有注册。这是我用来尝试实现它的完整代码。
# Socket IO Events
@socket_io.on('connect')
def on_connect():
app.logger.info("Connected!")
app.logger.info("SESSION INFO: " + str(session))
@socket_io.on('disconnect')
def on_disconnect():
app.logger.info("Client disconnected!")
app.logger.info("SESSION INFO: " + str(session))
if 'id' in session:
session.pop('id')
正如您所知,每当我注册并前往主页时,我都会收到一个会话 ID,当此断开连接事件触发时,我的会话 ID 会弹出。但是,看看这个输出。
[2021-07-30 14:20:39,765] INFO in app: Connected!
[2021-07-30 14:20:39,766] INFO in app: SESSION INFO: {'id': 1}
yjI1iUG5o3YmBgRlAAAA: Sending packet PING data None
9jo8DD7RQ5mEcUWZAAAI: Upgrade to websocket successful
yjI1iUG5o3YmBgRlAAAA: Received packet PONG data
HYTS2jEcmhqp9Vq5AAAE: Sending packet PING data None
KQznMBiop36XZLcTAAAC: Client is gone, closing socket
[2021-07-30 14:20:53,854] INFO in app: Client disconnected!
[2021-07-30 14:20:53,854] INFO in app: SESSION INFO: {}
[2021-07-30 14:21:35,164] INFO in app: Connected!
hBzSZoZ-W7_nesEBAAAK: Received request to upgrade to websocket
[2021-07-30 14:21:35,168] INFO in app: SESSION INFO: {'id': 1}
连接到页面后,它给了我一个会话 ID。然后,当我断开连接时,它会删除我的会话 ID,并清楚地显示在那里,它删除了我的会话 ID,因为会话字典中没有任何内容。但是,当我重新连接时,它会自动给我我的会话 ID。
现在,根据我从另一个 中读到的关于删除会话 ID 的内容,我不能使用 socketio 来更改客户端的 cookie,至少我是这么理解的。他还说最好将会话存储在服务器端。但我发现这有点麻烦,我不想就此放弃。有什么方法可以使用 Flask 的内置会话系统(在客户端存储 cookie)来存储客户端会话,但仍然允许我从 socket-io 的角度更改它们?我对此很迷茫。希望有人可以解释 socket-io 是如何工作的,或者只是提供一篇关于它的好而全面的文章。提前致谢 :) 但主要问题是,当我告诉它时,Flask-SocketIO 没有弹出会话 ID,我不确定为什么。
对不起,您被误导了。使用 Flask-SocketIO 只是为了在有人离开您的网站时通知您是非常矫枉过正的,正如您所见,它甚至无法满足您的目的。
如果您想知道为什么不能从 Socket.IO 事件处理程序更改用户会话,原因是 Flask-SocketIO 使用 WebSocket。用户会话保存在 cookie 中,只能在服务器对客户端发起的 HTTP 请求的响应中修改。 WebSocket 无法修改 cookie。
所以我会忘记为此使用 Flask-SocketIO。它实际上不是它的用例之一。
相反,我建议您考虑在您的页面中添加一个 beforeunload 事件,您可以在该事件中直接在客户端中删除会话 cookie。为此,您还需要将 SESSION_COOKIE_HTTPONLY
配置选项设置为 Flask,以便您页面中的 JavaScript 可以查看、修改和删除 cookie。请注意,这可能会带来安全隐患,因此在执行此操作之前请仔细考虑。
基本上,我想做的是在用户离开 website/close 标签页时删除他们的会话 ID,因为我希望他们每次访问该站点时都重新登录。我从其他 Stack Overflow 问题中听说我应该尝试 Flask-SocketIO 扩展,并使用断开连接事件来检测他们何时离开网站,然后从会话中弹出他们的 ID。所以这正是我所做的,但是,每当我弹出会话时,它实际上并没有注册。这是我用来尝试实现它的完整代码。
# Socket IO Events
@socket_io.on('connect')
def on_connect():
app.logger.info("Connected!")
app.logger.info("SESSION INFO: " + str(session))
@socket_io.on('disconnect')
def on_disconnect():
app.logger.info("Client disconnected!")
app.logger.info("SESSION INFO: " + str(session))
if 'id' in session:
session.pop('id')
正如您所知,每当我注册并前往主页时,我都会收到一个会话 ID,当此断开连接事件触发时,我的会话 ID 会弹出。但是,看看这个输出。
[2021-07-30 14:20:39,765] INFO in app: Connected!
[2021-07-30 14:20:39,766] INFO in app: SESSION INFO: {'id': 1}
yjI1iUG5o3YmBgRlAAAA: Sending packet PING data None
9jo8DD7RQ5mEcUWZAAAI: Upgrade to websocket successful
yjI1iUG5o3YmBgRlAAAA: Received packet PONG data
HYTS2jEcmhqp9Vq5AAAE: Sending packet PING data None
KQznMBiop36XZLcTAAAC: Client is gone, closing socket
[2021-07-30 14:20:53,854] INFO in app: Client disconnected!
[2021-07-30 14:20:53,854] INFO in app: SESSION INFO: {}
[2021-07-30 14:21:35,164] INFO in app: Connected!
hBzSZoZ-W7_nesEBAAAK: Received request to upgrade to websocket
[2021-07-30 14:21:35,168] INFO in app: SESSION INFO: {'id': 1}
连接到页面后,它给了我一个会话 ID。然后,当我断开连接时,它会删除我的会话 ID,并清楚地显示在那里,它删除了我的会话 ID,因为会话字典中没有任何内容。但是,当我重新连接时,它会自动给我我的会话 ID。
现在,根据我从另一个
对不起,您被误导了。使用 Flask-SocketIO 只是为了在有人离开您的网站时通知您是非常矫枉过正的,正如您所见,它甚至无法满足您的目的。
如果您想知道为什么不能从 Socket.IO 事件处理程序更改用户会话,原因是 Flask-SocketIO 使用 WebSocket。用户会话保存在 cookie 中,只能在服务器对客户端发起的 HTTP 请求的响应中修改。 WebSocket 无法修改 cookie。
所以我会忘记为此使用 Flask-SocketIO。它实际上不是它的用例之一。
相反,我建议您考虑在您的页面中添加一个 beforeunload 事件,您可以在该事件中直接在客户端中删除会话 cookie。为此,您还需要将 SESSION_COOKIE_HTTPONLY
配置选项设置为 Flask,以便您页面中的 JavaScript 可以查看、修改和删除 cookie。请注意,这可能会带来安全隐患,因此在执行此操作之前请仔细考虑。