Есть ли способ изменить сеанс flask внутри события flask-socketio?

#python-3.x #flask #flask-socketio

#python-3.x #flask #flask-socketio

Вопрос:

Я попробовал следующее:

 @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, что означает, что ключ не был сохранен внутри сеанса.

Ответ №1:

Некоторое время назад я написал сообщение в блоге и видео на эту тему, потому что это сложно. Вот сообщение: https://blog.miguelgrinberg.com/post/flask-socketio-and-the-user-session .

Короче говоря, сеансы на основе файлов cookie не могут быть изменены из сокета.Обработчик ввода-вывода, просто потому, что нет способа установить файлы cookie через WebSocket. Если вы переключаетесь на расширение сеанса на стороне сервера, такое как Flask-Session, то изменения, которые вы вносите в свой сокет.Обработчикам ввода-вывода не требуется устанавливать cookie в клиенте, поэтому в этом случае изменения сохраняются и доступны по HTTP-маршрутам.