Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 永久会话:在哪里定义它们?_Python_Session_Cookies_Flask_Flask Login - Fatal编程技术网

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

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。但就这样吧 我的问题是:如果你真的想要永久性的会

默认情况下,Flask使用易失性会话,这意味着会话cookie设置为在浏览器关闭时过期。要使用永久会话(将使用具有定义的过期日期的cookie),应按原样设置
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
    )