Frasco de sesión permanente: ¿dónde definirlos?

De forma predeterminada, Flask utiliza sesiones volátiles, lo que significa que la cookie de sesión está configurada para caducar cuando se cierra el navegador. Para usar sesiones permanentes, que usarán una cookie con una fecha de vencimiento definida, se debe establecer session.permanent = True , como se menciona en esta pregunta. y la fecha de caducidad se establecerá en función de la config['PERMANENT_SESSION_LIFETIME'] .

Me sorprende que la duración de la sesión esté definida en el archivo de configuración, sin embargo, no es posible solicitar el uso de sesiones permanentes a través de la configuración, como una config['USE_PERMANENT_SESSION'] = True . Pero que así sea.

Mi pregunta es: si quieres sesiones permanentes, ¿cuál es el mejor lugar para definirlas? ¿Está en una función @app.before_request como se propone en la pregunta mencionada? ¿Pero eso significaría volver a colocarlo en cada solicitud? Parece que una vez establecido, session.permanent permanece verdadero hasta el final de la sesión.

Las sesiones permanentes generalmente se usan después del inicio de sesión , por lo que quizás el mejor lugar para solicitarlas sea mientras se procesa login_user() . Entonces, ¿cuál es la mejor política para usar cookies de sesión volátiles para todas las páginas anónimas y cambiar a sesiones permanentes haciendo una session.permanent = True al session.permanent = True sesión?

Y uno podría querer establecer una duración diferente dependiendo de si se trata de la cookie de session ordinaria o la cookie remember_me . ¿Cuál sería la mejor manera de lograr esto?

Me sorprende que no haya respondido a esta pregunta. Parece que debería haber algún tipo de variable de configuración SESSION_PERMANENT = True . Pero lamentablemente no hay. Como mencionaste, esta es la mejor manera de hacerlo.

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

Elijo lo que dijiste “login_user ()”

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

si se establece en app.before_request , esto llevará a configurarlos también muchas veces.

¿Debería usar PERMANENT_SESSION_LIFETIME y session.permanent ?

Lo que realmente desea hacer es probablemente caducar el estado de inicio de sesión de los usuarios. Sin embargo, esta configuración expira el objeto de sesión / cookie que contiene el estado de inicio de sesión de los usuarios, así como (potencialmente) otros datos que almacenó en la session .

¿Necesitas configurar session.permanent ?

Según el documento de Flask :

La implementación de la cookie por defecto de Flask valida que la firma criptográfica no sea más antigua que este valor.

session.permanent es un complemento de PERMANENT_SESSION_LIFETIME . A veces está bien si no establece session.permanent en True.

Si no configura session.permanent , la duración de la sesión de Cookie no se verá afectada por PERMANENT_SESSION_LIFETIME . Pero Flask analizará PERMANENT_SESSION_LIFETIME y una marca de tiempo en la cookie de sesión, para ver si la cookie de sesión sigue siendo válida. Si la marca de tiempo es más antigua que la especificada por PERMANENT_SESSION_LIFETIME , se ignorará. Pero la cookie todavía existe.

Así es como Flask ignora la cookie de sesión:

 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() 

Si establece session.permanent=True , la validación aún se realizará. Y lo que es más, la cookie de sesión caducará y se eliminará del navegador después de PERMANENT_SESSION_LIFETIME .

Así es como PERMANENT_SESSION_LIFETIME controla el vencimiento de la 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 ) 

¿Necesita configurar session.permanent para cada solicitud?

session.permanent por defecto es en realidad session['_permanent'] . Su valor se mantendrá en session . Pero si va a asignarlo solo cuando los usuarios inicien sesión, manténgase alerta verificando cómo los usuarios pueden pasar por alto la ruta de inicio de sesión para iniciar sesión. Por ejemplo, al registrarse.