web-dev-qa-db-ja.com

Flask永続的なセッション:それらをどこで定義するか?

デフォルトでは、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であるかに応じて、異なる有効期間を設定したい場合があります。これを達成するための最良の方法は何でしょうか?

19
patb

I'm amazingd no onこの質問に回答しましたなんらかのタイプの設定変数SESSION_PERMANENT = True。しかし、残念ながらありません。あなたが言ったように、これはそれを行う最良の方法です。

@app.before_request
def make_session_permanent():
    session.permanent = True
16
mikey8989

PERMANENT_SESSION_LIFETIMEsession.permanentを使用する必要がありますか?

実際にやりたいのは、おそらくユーザーのサインインステータスの期限が切れることです。ただし、この構成では、ユーザーのサインインステータスとsessionに保存したその他のデータ(可能性があります)を含むセッションオブジェクト/ Cookieが期限切れになります。

session.permanentを設定する必要がありますか?

Flaskのドキュメント によると:

FlaskのデフォルトのCookie実装では、暗号署名がこの値よりも古いものではないことが検証されます。

session.permanentPERMANENT_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のままです。ただし、ユーザーがサインインする場合にのみ割り当てる場合は、サインアップのためにユーザーがサインインルートをバイパスできる方法をチェックして、警告を出します。たとえば、サインアップします。

2
Kaiwen Sun

私はあなたが言った「login_user()」を選択します

@asset.route('/login', methods=['GET', 'POST'])
def login():
    #After Verify the validity of username and password
    session.permanent = True

app.before_requestに設定すると、何度も設定される可能性があります。

2
tinyhare