В событии «connect» я хочу сохранить идентификатор сеанса клиента на стороне сервера с помощью Flask -Сессия для идентификации клиента по будущему запросу. Проблема в том, что объект сеанса, предоставленный Flask, похоже, не сохраняет сохраненные данные. В приведенном ниже примере я сохраняю идентификатор сеанса клиента в событии «connect» с помощью session['sid'] = request.sid и пытаюсь выйти из него в событии «disconnect», используя session.get('sid '). Однако при этом будет отключен сохраненный идентификатор сеанса, а не значение по умолчанию.
Это также верно для http-запросов на маршрутах Flask.
Код: Выделить всё
def create_app():
app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret_key'
app.config['SESSION_TYPE'] = 'cachelib'
app.config['SESSION_FILE_DIR'] = FileSystemCache(cache_dir='sessions')
Session(app)
socketio = SocketIO(app, manage_session=False)
init_routes(app, socketio)
return app, socketio
Код: Выделить всё
@socketio.on('connect')
def handle_connect():
session['sid'] = request.sid
print(f"Session ID: {session.get('sid')} connected")
@socketio.on('disconnect')
def handle_disconnect():
sid = session.get('sid')
print(f"Session ID: {sid} disconnected")
Код: Выделить всё
Session ID: AGDnl9e1mTkki6XAAAAB connected
server=127.0.0.1:8000//socket.io/ client=127.0.0.1:46222 socket shutdown error: [Errno 9] Bad file descriptor
Session ID: None disconnected
Код: Выделить всё
#!/bin/bash
#This script launches the Server.
if ! source .venv/bin/activate ; then exit 1 ; fi
gunicorn -w 1 -k eventlet app:app
exit $?
- Я пытался использовать другого работника, например gevent.
- Я попробовал использовать flask-cors, добавив:
Код: Выделить всё
Session(app)
CORS(app)
socketio = SocketIO(app, manage_session=False)
- Я пробовал использовать Manage_session=True, но это приводит к тому, что HTTP-запросы не могут получить доступ к данным сеанса.
- Я пробовал использовать разные типы сеансов, например файловую систему.
- Я пробовал очищать кеши, файлы cookie и локальные файлы сеансов.
- Я пробовал использовать session.modified = True после сеанса['sid'] = request.sid
Подробнее здесь: https://stackoverflow.com/questions/792 ... k-socketio