有没有办法在 flask-socketio 事件中修改 flask 会话?
Is there a way to modify a flask session inside a flask-socketio event?
我尝试了以下方法:
@socketio.on("signup req")
def signup_req(json):
print(f"Response! {json}")
socketio.emit("signup res", "RECEIVED!")
session["user"] = {"name": json["name"]}
但是当我想访问它时:
@app.route('/')
def index():
...
print(session["user"])
...
我会得到一个 KeyError,这意味着密钥没有存储在会话中。
我不久前写了一篇关于这个主题的博客post和视频,因为它很棘手。这是 post:https://blog.miguelgrinberg.com/post/flask-socketio-and-the-user-session.
简而言之,无法从 Socket.IO 处理程序修改基于 cookie 的会话,原因很简单,因为无法通过 WebSocket 设置 cookie。如果您切换到服务器端会话扩展,例如 Flask-Session,那么您在 Socket.IO 处理程序中所做的更改不需要在客户端中设置 cookie,因此在这种情况下,更改将被保存并可访问来自 HTTP 路由。
我尝试了以下方法:
@socketio.on("signup req")
def signup_req(json):
print(f"Response! {json}")
socketio.emit("signup res", "RECEIVED!")
session["user"] = {"name": json["name"]}
但是当我想访问它时:
@app.route('/')
def index():
...
print(session["user"])
...
我会得到一个 KeyError,这意味着密钥没有存储在会话中。
我不久前写了一篇关于这个主题的博客post和视频,因为它很棘手。这是 post:https://blog.miguelgrinberg.com/post/flask-socketio-and-the-user-session.
简而言之,无法从 Socket.IO 处理程序修改基于 cookie 的会话,原因很简单,因为无法通过 WebSocket 设置 cookie。如果您切换到服务器端会话扩展,例如 Flask-Session,那么您在 Socket.IO 处理程序中所做的更改不需要在客户端中设置 cookie,因此在这种情况下,更改将被保存并可访问来自 HTTP 路由。