2016-08-07 4 views
1

docsによると:フラスコセッション変数はスレッド間で状態を維持しますか?

セッションは基本的に別の 要求からの情報を覚えておくことが可能になるが。

しかし、他の場所では、the docs sayそのsessionはスレッドに対してローカルです。したがって、flaskがマルチスレッド環境(たとえば、app.run(threaded=True))で使用されている場合、どうすればこの約束を果たすことができますか?

私は2つのだけの選択肢を参照してください。

  • flaskは何とかつのタブで、単一のユーザーの閲覧は彼の最初のを待つ必要があるため、同じユーザーセッションは常に恐ろしいようだ同じスレッド(によってサービスされることを保証します
  • sessionはスレッドを許可していて、セッション固有の情報をデータベースに保存する必要があります(予期せず、ドキュメントには記載されていないようです)

何か不足していますか?

編集:

  • session自体は(つまり、Pythonは各スレッドのsession完全に独立したオブジェクトとしてを見ている)のpythonの観点から、スレッドローカル変数であるが、それは何らかの形でスレッド間で同期されている:私は別の選択肢があると思いますflask(おそらく、いくつかのプロセス全体のインメモリデータ構造で)。その場合、flaskはすべての変更をsessionアトミック(スレッド間の同期メカニズムを使用して)にすることができます。

アップデート:@Daniel Rosemanの回答に基づいて、私の最後の推測は正しいですが、フラスコはそれ自体ではなく、永続的な状態を格納/取得するよう要求します(したがって、状態はフラスコプロセスまたはフラスコアプリケーションではなく、ユーザーエージェントが状態を永続化させる何らかの要求の集まり - 何をユーザセッションと呼んでもよい)。あなたが引用された1後非常に次の文から

+0

は、バックエンドセッションミドルウェア – reptilicus

+0

@reptilicusを実装していない限りクッキーを使用しますが、クッキーは実際にセッションの状態データAFAIKを保存しません。セッションに固有の識別子だけを格納します。どの状態情報も 'session'変数に格納しなければなりません。したがって、複数のスレッドが同じセッションであることを認識しているかもしれませんが、他のスレッドによって 'session'変数に書き込まれたデータにアクセスすることはできません。これは 'session'変数の目的をすべて破ります。 – max

+0

基本的に必要なものはすべて保存できます。それは基本的にdictのように動作します。 – reptilicus

答えて

2

フラスコが、これは署名クッキーを使用することですない方法。

Flaskは、応答を送信する前にクッキーに情報を格納し、次の要求の開始時にそれを読み戻します。

+0

クッキーは 'session'辞書の全内容を保存しますか?それは超危険ではないのですか?データが大きい場合は遅くなりますか? – max

+0

また、クッキーの最大サイズは4Kですので、わずかな量のデータしか保存できません。 – max

+0

もちろんフラスコはクッキーにトークンを保存するだけです。セッションデータはサーバー側に保存されます。 –

関連する問題