Flask永久会话:在哪里定义它们?

时间:2015-12-06 13:46:19

标签: python session cookies flask flask-login

默认情况下,Flask使用易失会话,这意味着会话cookie设置为在浏览器关闭时过期。为了使用永久会话(将使用具有已定义到期日期的cookie),应该设置session.permanent = Truementioned in this question.,并且将根据config['PERMANENT_SESSION_LIFETIME']设置到期日期。

我很惊讶会话生存期在配置文件中定义,但是无法通过配置请求使用永久会话,例如config['USE_PERMANENT_SESSION'] = True。但就这样吧。

我的问题是:如果您 想要永久会话,那么定义它们的最佳位置是什么?它是否在上述问题中提出的@app.before_request函数中?但是这意味着每次请求都会重新设置它?似乎一旦设定,session.permanent仍然存在,直到会话结束。

永久会话通常在登录后使用 ,因此在处理login_user()时,请求它们的最佳位置可能是?那么对所有匿名页面使用易失性会话cookie的最佳策略是什么,并在登录时通过session.permanent = True切换到永久会话?

根据是普通的session cookie还是remember_me cookie,人们可能希望设置不同的生命周期。实现这一目标的最佳方法是什么?

3 个答案:

答案 0 :(得分:15)

我很惊讶没有回答这个问题。似乎应该有某种类型的配置变量SESSION_PERMANENT = True。但不幸的是没有。正如您所说,这是最好的方法。

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

答案 1 :(得分:1)

我选择你所说的" 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 :(得分:1)

您应该使用PERMANENT_SESSION_LIFETIMEsession.permanent吗?

您实际想要做的可能是使用户的登录状态到期。但是,此配置会使会话对象/ cookie失效,该会话对象/ cookie包含用户的登录状态以及您(可能)存储在session中的其他一些数据。

您需要设置session.permanent吗?

根据Flask's doc

  

Flask的默认Cookie实施可验证加密签名不​​早于该值。

session.permanentPERMANENT_SESSION_LIFETIME的附加组件。有时,如果不将session.permanent设置为True,就可以。

如果您未设置session.permanent,则会话cookie的生存期将不受PERMANENT_SESSION_LIFETIME的影响。但是Flask会查看会话Cookie中的PERMANENT_SESSION_LIFETIME和时间戳,以查看会话Cookie是否仍然有效。如果时间戳记早于PERMANENT_SESSION_LIFETIME指定的时间戳记,它将被忽略。但是cookie仍然存在。

这是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中。 但是,如果要仅在用户登录时进行分配,请通过检查用户如何绕过登录路径进行登录来保持警觉。例如,通过注册。