webentwicklung-frage-antwort-db.com.de

Ständige Sitzung der Flasche: Wo sollen sie definiert werden?

Standardmäßig verwendet Flask flüchtige Sitzungen. Dies bedeutet, dass das Sitzungscookie beim Schließen des Browsers abläuft. Um permanente Sitzungen zu verwenden, bei denen ein Cookie mit einem definierten Ablaufdatum verwendet wird, sollte session.permanent = True wie in dieser Frage erwähnt festgelegt werden. Das Ablaufdatum wird basierend auf config['PERMANENT_SESSION_LIFETIME'] festgelegt.

Ich bin überrascht, dass die Sitzungslebensdauer in der Konfigurationsdatei definiert ist, es jedoch nicht möglich ist, die Verwendung permanenter Sitzungen über die Konfiguration anzufordern, z. B. einen config['USE_PERMANENT_SESSION'] = True. Aber so sei es.

Meine Frage ist: Wenn Sie do dauerhafte Sitzungen wünschen, was ist der beste Ort, um sie zu definieren? Befindet es sich in einer @app.before_request Funktion wie in der genannten Frage vorgeschlagen? Aber das würde bedeuten, es bei jeder Anfrage erneut einzustellen? Es scheint, dass session.permanent nach dem Setzen bis zum Ende der Sitzung gültig bleibt.

Permanente Sitzungen werden in der Regel nach der Anmeldung verwendet. Der beste Ort, um sie anzufordern, ist also die Verarbeitung von login_user()? Ist es also die beste Richtlinie, flüchtige Sitzungscookies für alle anonymen Seiten zu verwenden und zu permanenten Sitzungen zu wechseln, indem Sie bei der Anmeldung einen session.permanent = True eingeben?

Je nachdem, ob es sich um das normale session-Cookie oder um das remember_me-Cookie handelt, kann eine andere Lebensdauer festgelegt werden. Was wäre der beste Weg, um dies zu erreichen?

16
patb

Ich bin überrascht, dass niemand diese Frage beantwortet hat. Es scheint, als sollte es eine Art Konfigurationsvariable SESSION_PERMANENT = True geben. Aber leider nicht. Wie Sie erwähnt haben, ist dies der beste Weg, dies zu tun. 

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

Sollten Sie PERMANENT_SESSION_LIFETIME und session.permanent verwenden?

Eigentlich möchten Sie wahrscheinlich den Anmeldestatus der Benutzer verfallen lassen. Bei dieser Konfiguration läuft jedoch das Sitzungsobjekt/Cookie ab, das den Anmeldestatus der Benutzer sowie (möglicherweise) einige andere Daten enthält, die Sie in session gespeichert haben.

Müssen Sie session.permanent einstellen?

Nach Flask's doc :

Die Standard-Cookie-Implementierung von Flask bestätigt, dass die kryptografische Signatur nicht älter als dieser Wert ist.

session.permanent ist ein Add-On von PERMANENT_SESSION_LIFETIME. Manchmal ist es in Ordnung, wenn Sie session.permanent nicht auf True setzen.

Wenn Sie nicht session.permanent festlegen, wird die Lebensdauer des Sitzungscookies nicht durch PERMANENT_SESSION_LIFETIME beeinflusst. Aber Flask prüft PERMANENT_SESSION_LIFETIME und einen Zeitstempel im Sitzungscookie, um festzustellen, ob der Sitzungscookie noch gültig ist. Wenn der Zeitstempel zu alt ist als durch PERMANENT_SESSION_LIFETIME angegeben, wird er ignoriert Der Cookie ist noch vorhanden.

So ignoriert Flask das Session-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()

Wenn Sie session.permanent=True einstellen, wird die Validierung trotzdem durchgeführt. Außerdem läuft das Sitzungscookie ab und wird nach PERMANENT_SESSION_LIFETIME aus dem Browser gelöscht.

So steuern PERMANENT_SESSION_LIFETIME das Ablaufen des Cookies:

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
    )

Müssen Sie für jede Anfrage session.permanent setzen?

session.permanent ist standardmäßig session['_permanent']. Sein Wert bleibt in session. Wenn Sie es jedoch nur zuweisen möchten, wenn sich Benutzer anmelden, überprüfen Sie, wie Benutzer die Anmelderoute für die Anmeldung umgehen können. Zum Beispiel, indem Sie sich anmelden.

1
Kaiwen Sun

Ich wähle, was du gesagt hast "login_user ()"

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

wenn es auf app.before_request gesetzt ist, führt dies dazu, dass sie auch mal gesetzt werden.

0
tinyhare