2017-07-17 11 views
1

私は、セッションを初期化するためにユーザーがアプリケーションに渡したいくつかのデータを各リクエストで使用する必要があるFlaskアプリケーションを作成しています。データを渡してセッションを初期化したら、リクエストごとにデータを渡すことなくリクエストを満たすセッションが完了するまで、そのデータを何度も再利用したいと思います。セッションのユーザーデータをFlaskに保存する方法は?

私はこれを行うための最良の方法を理解できないようです。それをセッション変数に格納するのは、データがユーザーに返された後、すべての要求を渡すだけなので、機能しません。データをデータベースに格納するのは正しい選択のようには思えません。なぜなら、セッションの終わりにそれを投げ捨てる必要があります。セッションが終了すると実装するデコレータは表示されません。恐らく私のデータベースは、初期化から来たこれらのすべてのデータで満たされてしまい、セッション終了時にそれらを削除する保証された方法はありません。

提案がありますか?

+0

https://pythonhosted.org/Flask-Session/おそらく? –

答えて

1

クライアントに保存されているセッション、またはサーバーに保存されているセッションの2つのオプションがあります。

サーバーに保存するには、データストアが必要です。あなたのアプリが(複数のuwsgiワーカーを含めて)ある程度まで拡張できるならば、分散したストアを使う必要があります。赤ちゃんがいるなら、それが最善の選択でしょう。これを行うには、コメントにSimon Fraserによって投稿されたFlask-Sessionの例を参照してください。セッションオブジェクトをデータベースに格納し、必要に応じてセッションオブジェクトから値を取得する処理を行います。それは多くのバックエンドも処理するので、あなたが持っているデータベースがあればそれをそのまま使って作業するでしょう。

バックエンドセッションを使用しない場合は、クライアントセッションを使用する必要があります。これは、ブラウザがサイトに送信するほとんどのリクエストにCookieクッキーを自動的に付加するように設定することによって行われます。そのため、Cookieに保存された値は通常あなたに戻ってきます。 (これはフェイスブックがどのページにもログインせずにあなたの人物を覚えている方法です。実際、Flask-Sessionはどのセッションを復元するかを追跡しています!これを信頼できるようにするには、ユーザーが値を変更できないようにクッキーに署名する必要があります.FlaskはSessionが組み込まれています。Hereのように優れた暗号ライブラリを使用できます。ユーザーに値を表示させたくない場合や、保存するデータがたくさんある場合(クッキーの最大サイズが制限されている場合)、このすべてのサーバー側のバージョンを使用する必要があります。

+0

お返事ありがとうございます。私はクッキーでセッション変数を使用しましたが、問題は、実際にセッション側に格納し、その後すべての要求に利用するのではなく、すべての要求に対して2万バイトのデータを送信することになります。 セッションデータにmongodbまたはredisを使用すると、セッション終了時にそのセッションデータをクリアする処理方法がわかりません。私がセッションティアダウンのために走らせることができるデコレータがないように見えるので、セッションデータが不要になったときにredis/mongodbをクリアすることができます。 – Roshmaster

+0

あなたは、セッションが終了したときに、ユーザーがブラウザ間で何をしているのか分かりません。あなたのアプリケーションに意味がある場合は、あなたの 'ログアウト'機能でセッションを空にすることができます。おそらく、より適切な場合は、データに短いETLを設定し、データベースでクリーンアップを処理させるだけです。 –

+0

そうです、私は、セッションが終了したときはわかりません。これを回避するために、セッションの有効期間を5分に設定し、ユーザーがリクエストを実行するたびにリフレッシュされます。実際には、最後のリクエストから5分後にセッションが終了することを知っています。セッションがタイムアウトしたときにティアダウンを処理する方法があるのであれば私は興味がありますか? ETLとは、抽出/変換/ロード、またはこれらのDBに固有のことを認識していない別のメカニズムを意味しますか? – Roshmaster

関連する問題