Новые файлы сессий перезаписывают старые файлы сессий, даже если создается отдельный каталог (Flask) - PullRequest
1 голос
/ 18 февраля 2020

У меня есть приложение Flask, в котором мне нужно хранить временные файлы для разных экземпляров приложения в папке, именем которой является время, когда приложение было открыто. У меня есть функция индекса следующим образом:

@app.route('/')
def index():
    session["now"] = time.time() * 100.0
    os.mkdir(str(session["now"]))

Приведенный выше код создает каталог, где имя каталога - это время, когда приложение было открыто. Когда я открываю приложение на двух отдельных вкладках в Chrome, создаются два разных каталога, как и ожидалось.

Однако есть одна проблема. В моем пользовательском интерфейсе есть текстовая область, текст которой необходимо сохранить в текстовом файле в каталоге, созданном выше. Я использовал запрос POST для отправки данных. Ниже приведен метод Flask - Python:

@app.route('/rt3/', methods=['POST']) 
def fn3():
    x = request.get_json()
    data = x['textbox1']
    f = open("./" + str(session["now"]) + "/mytext.txt", "w")
    f.write(data)
    f.close()

Проблема заключается в следующем: независимо от того, на какой вкладке Chrome я нажимаю кнопку «Выполнить», текстовый файл всегда сохраняется в каталоге сеанса, созданного позже. Следовательно, один и тот же текстовый файл перезаписывается снова и снова. Поскольку я использовал переменные сеанса, не следует ли сохранить их в каталоге своего сеанса? Почему переменная сеанса перезаписывается?

1 Ответ

2 голосов
/ 18 февраля 2020

Это вполне ожидаемо. При локальном запуске 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, поэтому вы будете использовать другое значение сеанса.

...