Сеансы на основе файлов cookie не являются потокобезопасными.Любой данный запрос видит только куки-файл сеанса, отправленный вместе с ним, и возвращает куки-файл только с изменениями этого запроса.Это не специфично для Flask, это то, как работают HTTP-запросы.
Вы выполняете три запроса параллельно.Все они читают исходный файл cookie, который содержит только ключ _permanent
, отправляют свои запросы и получают ответ, который устанавливает файл cookie с определенным ключом.Каждый cookie-файл ответа будет содержать только ключ _permanent
и ключ key_keyN
.Какой бы запрос не завершал последнюю запись в файл, перезаписывая предыдущие данные, поэтому у вас остается только его cookie.
На практике это не проблема.Сессия на самом деле не предназначена для хранения данных, которые быстро меняются между запросами, для этого и нужна база данных.Вещи, которые изменяют сеанс, такие как вход в систему, не происходят параллельно с одним и тем же сеансом (и в любом случае являются идемпотентными).
Если вы действительно обеспокоены этим, используйте сеанс на стороне сервера, чтобыхранить данные в базе данных.Базы данных хорошо умеют синхронизировать записи.
Вы уже используете Flask-Session и Redis, но изучение реализации Flask-Session показывает, почему у вас возникла эта проблема.Flask-Session не сохраняет каждый ключ сеанса отдельно, он записывает одно сериализованное значение со всеми ключами.Таким образом, он страдает той же проблемой, что и сеансы на основе файлов cookie: только то, что присутствовало во время этого запроса, возвращается в Redis, перезаписывая то, что произошло параллельно.
В этом случае будет лучше написать свой собственный SessionInterface
подкласс для хранения каждого ключа в отдельности.Вы должны переопределить save_session
, чтобы установить все ключи в session
и удалить все, которых нет.