デフォルトでは、Flaskは揮発性セッションを使用します。つまり、ブラウザーが閉じるときにセッションCookieが期限切れになるように設定されます。定義された有効期限のCookieを使用する永続的なセッションを使用するには、 _session.permanent = True
_をそのまま設定 この質問に記載されています。 、および_config['PERMANENT_SESSION_LIFETIME']
_に基づいて有効期限が設定されます。
セッションの存続期間が構成ファイルで定義されていることに驚きますが、_config['USE_PERMANENT_SESSION'] = True
_などの構成を介して永続的なセッションの使用を要求することはできません。しかし、そうなります。
私の質問は:do永続的なセッションが必要な場合、それらを定義するのに最適な場所はどこですか?上記の質問で提案されているように、それは_@app.before_request
_関数内にありますか?しかし、それはリクエストごとに設定し直すことを意味しますか?一度設定すると、_session.permanent
_はセッションの終了までtrueのままです。
パーマネントセッションは一般的に使用されますサインイン後なので、セッションをリクエストするのに最適な場所は、login_user()
の処理中でしょう。それで、すべての匿名ページに揮発性セッションCookieを使用し、サインイン時に_session.permanent = True
_を実行して永続的なセッションに切り替えるのが最善のポリシーですか?
そして、それが通常のsession
cookieであるか、_remember_me
_ cookieであるかに応じて、異なる有効期間を設定したい場合があります。これを達成するための最良の方法は何でしょうか?
I'm amazingd no onこの質問に回答しましたなんらかのタイプの設定変数SESSION_PERMANENT = True
。しかし、残念ながらありません。あなたが言ったように、これはそれを行う最良の方法です。
@app.before_request
def make_session_permanent():
session.permanent = True
PERMANENT_SESSION_LIFETIME
とsession.permanent
を使用する必要がありますか?実際にやりたいのは、おそらくユーザーのサインインステータスの期限が切れることです。ただし、この構成では、ユーザーのサインインステータスとsession
に保存したその他のデータ(可能性があります)を含むセッションオブジェクト/ Cookieが期限切れになります。
session.permanent
を設定する必要がありますか?Flaskのドキュメント によると:
FlaskのデフォルトのCookie実装では、暗号署名がこの値よりも古いものではないことが検証されます。
session.permanent
はPERMANENT_SESSION_LIFETIME
のアドオンです。 session.permanent
をTrueに設定しなくても問題ない場合があります。
session.permanent
を設定しない場合、セッションCookieの存続期間はPERMANENT_SESSION_LIFETIME
の影響を受けません。ただし、Flaskは、セッションCookieのPERMANENT_SESSION_LIFETIME
とタイムスタンプを調べて、セッションCookieがまだ有効かどうかを確認します。タイムスタンプがPERMANENT_SESSION_LIFETIME
で指定されたものよりも古い場合、無視されます。しかし、クッキーはまだ存在しています。
これはFlaskがセッションCookieを無視する方法です:
def open_session(self, app, request):
s = self.get_signing_serializer(app)
if s is None:
return None
val = request.cookies.get(app.session_cookie_name)
if not val:
return self.session_class()
max_age = total_seconds(app.permanent_session_lifetime)
try:
data = s.loads(val, max_age=max_age)
return self.session_class(data)
except BadSignature:
return self.session_class()
session.permanent=True
を設定した場合でも、検証は行われます。さらに、セッションCookieは期限切れになり、PERMANENT_SESSION_LIFETIME
の後にブラウザから削除されます。
これは、PERMANENT_SESSION_LIFETIME
がCookieの有効期限を制御する方法です。
def get_expiration_time(self, app, session):
if session.permanent:
return datetime.utcnow() + app.permanent_session_lifetime
def save_session(self, app, session, response):
...
expires = self.get_expiration_time(app, session)
val = self.get_signing_serializer(app).dumps(dict(session))
response.set_cookie(
app.session_cookie_name,
val,
expires=expires,
httponly=httponly,
domain=domain,
path=path,
secure=secure,
samesite=samesite
)
session.permanent
を設定する必要がありますか?デフォルトのsession.permanent
は実際にはsession['_permanent']
です。その値はsession
のままです。ただし、ユーザーがサインインする場合にのみ割り当てる場合は、サインアップのためにユーザーがサインインルートをバイパスできる方法をチェックして、警告を出します。たとえば、サインアップします。
私はあなたが言った「login_user()」を選択します
@asset.route('/login', methods=['GET', 'POST'])
def login():
#After Verify the validity of username and password
session.permanent = True
app.before_requestに設定すると、何度も設定される可能性があります。