2016-08-07 2 views
1

Согласно docs:Поддерживает ли переменная сеанса фляж через потоки?

Сеанс в основном позволяет запоминать информацию от одного запроса к другому.

Но в другом месте, the docs say, что session является локальным для резьбы. Итак, если flask используется в многопоточной среде (скажем, app.run(threaded=True)), как он может выполнить это обещание?

Я вижу только два варианта:

  • flask как-то гарантирует, что тот же сеанс пользователя всегда обслуживается в том же потоке (который, кажется ужасным, потому что один просмотр пользователь в двух вкладках придется ждать его первый запрос на завершение до того, как будет обработан второй запрос)
  • session совершенно бесполезен, если я разрешаю потоки, и мне нужно хранить информацию о сеансе в базе данных (что кажется довольно неожиданным и не упоминается в документах)

Я что-то пропустил?

Edit: Я думаю, еще одна альтернатива:

  • session сам по себе является поточно-локальная переменная из питона точки зрения (т.е. питон видит session как совершенно независимые объекты каждого потока), но это как-то синхронизированы между потоками на flask (предположительно, с некоторой структурой данных в глобальной памяти). В этом случае flask может внести все изменения в session atomic (используя некоторый механизм синхронизации между потоками).

Обновления: на основе @Daniel Роземан ответа, мое последнее предположение было правильно, за исключением колба не делает это самим, а запрашивает у агента пользователя для хранения/извлечения постоянного состояния (и, таким образом, государство не в процесс колбы или за флеш-приложение, но, по сравнению с любой коллекцией запросов, которые пользовательский агент продолжает сохранять, - то, что можно было бы назвать пользовательской сессией).

+0

использует файлы cookie, если вы не используете промежуточное ПО промежуточного сеанса – reptilicus

+0

@reptilicus, но файлы cookie фактически не сохраняют никаких данных состояния для сеанса AFAIK. Единственный хранит уникальный идентификатор сеанса. Любая информация о состоянии должна храниться в переменной 'session'. Поэтому, хотя несколько потоков могут знать, что это один и тот же сеанс, они не будут иметь доступ к данным, записанным в переменной 'session', другими потоками. Это побеждает всю цель переменной 'session'. – max

+0

вы можете хранить все, что хотите в основном.он в основном действует как дикт. – reptilicus

ответ

2

Из следующего предложения после того, вы процитировали:

Пути Колба делает это с помощью подписанного печенья.

Флакон хранит информацию в файле cookie перед отправкой ответа и считывает его обратно в начале следующего запроса.

+0

Сохраняет ли файл cookie все содержимое словаря 'session' ?! Разве это не слишком опасно, а также медленно, если данные большие? – max

+0

А также максимальный размер файла cookie составляет 4K, поэтому он может хранить только крошечный объем данных, затем? – max

+0

Колба, конечно, хранит только маркер в файле cookie. Данные сеанса хранятся на стороне сервера. –

Смежные вопросы