Это вполне ожидаемо. При локальном запуске Flask вы, скорее всего, используете один единственный процесс / экземпляр, который обрабатывает все ваши запросы (многопоточный по умолчанию в новых Flask версиях, поэтому вы можете обрабатывать несколько запросов параллельно).
Помните, что у вас не разные экземпляры приложения, а только один, независимо от того, сколько Chrome вкладок вы открываете. Вам нужно будет использовать gunicorn или любой другой WSGI для порождения нескольких экземпляров и сделать их полностью независимыми.
В вашем примере, когда вы делаете session["now"] = time.time() * 100.0
, вы просто переопределяете каждый раз, когда содержимое session["now"]
. Таким образом, при доступе к нему из fn3()
вы, очевидно, получите последнюю версию (последнее переопределение).
Теперь, если вы ДЕЙСТВИТЕЛЬНО хотите достичь этого, вам нужно будет передать явный «каталог» идентификатор (необязательно основанный на времени) в каждом запросе, чтобы вы могли использовать его для создания каталога и записи в него файлов.
РЕДАКТИРОВАТЬ (20.02.2020)
После еще нескольких исследований Flask сеансов сохраняются в cook ie на стороне клиента (см. do c)
Как следствие, при вызове session
из 2 запросов, поступающих из 2 разных вкладок (из одного и того же «экземпляра» браузера), вы получаете доступ к одному и тому же куку ie, то есть к одному и тому же значению. Однако, если вы откроете другой браузер (или новую вкладку Chrome Incognito, например), у вас будет новый повар ie, поэтому вы будете использовать другое значение сеанса.