8

したがって、Flaskセッションについての私の理解は、それを辞書のように使用して、次のようにしてセッションに値を追加できるということです。

session['キー名'] = 'ここに何らかの値'

そして、それはうまくいきます。

AJAX ポストを使用してクライアントを呼び出すルートで、セッションに値を割り当てます。そして、それはうまくいきます。サイトのさまざまなページをクリックすることができ、値はセッションにとどまります。ただし、ブラウザー ウィンドウを閉じてからサイトに戻ると、そこにあったセッション値は失われています。

それは奇妙で、問題はセッションが永続的ではないことだと思うでしょう。また、Flask-Openid も実装しました。これはセッションを使用して情報を保存しブラウザー ウィンドウを閉じて再度開いても保持されます。また、ブラウザ ウィンドウを閉じた後、自分のサイトに戻る前に Cookie を確認しましたが、実際には Cookie がまだ残っています。

もう 1 つの奇妙な動作 (関連している可能性があります) は、AJAX ポスト ルートにアクセスして正しい値を割り当てると、テスト目的でセッションに書き込んだ値の一部が消えてしまうことです。これは奇妙ですが、本当に奇妙なのは、ブラウザ ウィンドウを閉じて再度開くと、保持しようとしていた値が失われ、以前に失った値が実際に戻ってくることです。これらの値を再割り当てするためのコードが Python ファイルにないため、それらは再割り当てされていません。

ヘルパーへの出力をいくつか示します。これらはすべて、前述の AJAX ポスト ルートではなく、実際のページのルートから出力されます。

これは、セッションに保存する値を割り当てた後の出力です。値のキーは「userid」です。その他の値はすべて、この問題を解決するために追加したダミーの値です。'userid': 8 は、ブラウザー ウィンドウを閉じない限り、セッションにとどまります。他のルートにアクセスでき、値は本来あるべきようにそこにとどまります。

['session.=', <SecureCookieSession {'userid': 8, 'test_variable_num': 102, 'adding using before request': 'hi', '_permanent': True, 'test_variable_text': 'hi!'}>]

ブラウザ ウィンドウを閉じてサイトに戻ると、AJAX ポスト リクエストをやり直さずに次の出力が得られます。

['session.=', <SecureCookieSession {'adding using before request': 'hi', '_permanent': True, 'yo': 'yo'}>]

「よ」の値は、最初の最初の出力にはありませんでした。どこから来たのかわからない。コードで「yo」を検索しましたが、その値をどこにも割り当てた例はありません。数日前にセッションに追加したと思います。したがって、永続化されているように見えますが、他の値が書き込まれると隠されます。

最後に、AJAX ポスト ルートに再度アクセスし、デバッグを使用してキーを出力するページに移動します。上記で貼り付けた最初の出力と同じ出力であり、期待どおりであり、「yo」の値が再び消えています (ただし、ブラウザー ウィンドウを閉じると元に戻ります)

['session.=', <SecureCookieSession {'userid': 8, 'test_variable_num': 102, 'adding using before request': 'hi', '_permanent': True, 'test_variable_text': 'hi!'}>]

Chrome と Firefox の両方でこれをテストしました。

だから私はこれがすべて奇妙だと思っており、セッションがどのように機能するかについての誤解から生じていると推測しています. それらは辞書だと思います。セッションを永続的に設定し、Cookie が削除されない限り、辞書の値を書き込み、数日後に取得できます。

この奇妙な動作が起こっている理由はありますか?

4

2 に答える 2

15

問題は複数のドメイン Cookie であることがわかりました。私は 127.0.0.1:5000 でローカルにサイトを実行していますが、時々 localhost:5000 でサイトにアクセスしたため、これらの各ドメインには個別の Cookie がありました。これは、データが消えてから再び現れた理由を説明しています。異なるドメインに関連付けられていました。

以下は単なる追加の詳細です

これは、Facebook がドメイン名の IP アドレスを好まないために発生しました。そのため、ローカルで開発するときは 127.0.0.1:5000 を使用していましたが、Facebook のコールバック URL は localhost:5000 でした。Flask は両方の URL でリクエストを取得し、それらを同じように処理するため、これは正常に機能します。すべてのルートが期待どおりに機能します。異なる URL に関連付けられるセッション Cookie を除きます。

于 2012-12-07T22:12:24.690 に答える
5

を設定していない場合、ブラウザを閉じるとフラスコセッションは削除されますsession.permanent = True。これがフラスコセッションの定義方法であり、ドキュメントに記載されています。

ただし、セッションを永続的に設定した場合、デフォルトはセッションが持続する31日です。そのデフォルトは。で変更することもできますsession.permanent_session_lifetime。これは、もちろん、Cookie自体を手動で削除しない限り、ブラウザを閉じてもセッションが持続することを意味します。

あなたの場合、AJAX呼び出しをどのように使用しているかはわかりませんが、一般的に、デフォルトのフラスコセッションについては上記が当てはまります。

于 2012-12-07T16:03:23.197 に答える