Python 永久会话:在哪里定义它们?
默认情况下,Flask使用易失性会话,这意味着会话cookie设置为在浏览器关闭时过期。要使用永久会话(将使用具有定义的过期日期的cookie),应按原样设置Python 永久会话:在哪里定义它们?,python,session,cookies,flask,flask-login,Python,Session,Cookies,Flask,Flask Login,默认情况下,Flask使用易失性会话,这意味着会话cookie设置为在浏览器关闭时过期。要使用永久会话(将使用具有定义的过期日期的cookie),应按原样设置session.permanent=True,过期日期将根据config['permanent\u session\u life']设置 我很惊讶,配置文件中定义了会话生存期,但无法通过配置请求使用永久会话,例如config['use\u permanent\u session']=True。但就这样吧 我的问题是:如果你真的想要永久性的会
session.permanent=True
,过期日期将根据config['permanent\u session\u life']
设置
我很惊讶,配置文件中定义了会话生存期,但无法通过配置请求使用永久会话,例如config['use\u permanent\u session']=True
。但就这样吧
我的问题是:如果你真的想要永久性的会议,什么是定义它们的最佳场所?它是否在上述问题中建议的请求前的@应用程序中?但这意味着每次请求时都要重新设置?似乎一旦设置,session.permanent
在会话结束前保持为真
永久会话通常在登录后使用,因此请求永久会话的最佳位置可能是处理login\u user()
?因此,最好的策略是对所有匿名页面使用易失性会话cookie,并通过在登录时执行session.permanent=True
切换到永久会话吗
根据是普通的会话
cookie还是记住我
cookie,可能需要设置不同的生存期。实现这一目标的最佳方法是什么?我很惊讶没有人回答这个问题。似乎应该有某种类型的配置变量SESSION\u PERMANENT=True
。但不幸的是没有。正如你提到的,这是最好的方法
@app.before_request
def make_session_permanent():
session.permanent = True
我选择你说的“登录用户()
如果在请求之前将其设置为app.,这将导致设置时间过长。是否应使用永久会话
和会话.永久
?
您实际上想要做的可能是使用户的登录状态过期。但是,此配置会使会话对象/cookie过期,其中包含用户的登录状态以及(可能)存储在会话中的一些其他数据
是否需要将会话设置为永久性?
根据:
Flask的默认cookie实现验证加密签名不早于此值
session.permanent
是permanent\u session\u life
的附加组件。有时,如果不将session.permanent
设置为True,也可以
如果未设置session.permanent
,则会话cookie的生存期将不受permanent\u session\u life
的影响。但是Flask将查看会话cookie中的永久会话生命周期和时间戳,以查看会话cookie是否仍然有效。如果时间戳比永久会话\u生存期
指定的时间戳太长,它将被忽略。但是饼干仍然存在
这就是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将在永久会话\u生存期之后过期并从浏览器中删除
这就是永久会话\u生存期控制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[''u permanent']
。其值将保留在会话中
。
但是,如果您只打算在用户登录时分配,请通过检查用户如何绕过登录路径登录来保持警惕。例如,通过注册。配置['PERMANENT\u SESSION\u LIFETIME']的值是秒还是毫秒?config['SESSION\u PERMANENT']=True
在now中。@dashesy,您指的是扩展中的配置。在会话管理中,config['session\u PERMANENT']
不存在,甚至在主分支中也不存在。非常详细和有用的回答,您能否详细说明一下用户如何通过注册绕过登录路径?
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
)