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