Python中如何配置Flask的session和cookie过期时间

现在要实现两个功能:
1.用户关掉浏览器后,2 个小时之内再打开,可以不用再登录。
2.用户登录后,停在页面 1 个小时不操作,则强制登出。

我现在用的是 Flask-login,用了 login_user()的 remember me 功能,并在 config 里配置了 REMEMBER_COOKIE_DURATION = timedelta(hours=2)。我原以为这一步只能实现第一个功能。

后来我又谷歌了半天,很多都说要配置 session 以实现第二个功能:
在 login 的视图函数中:
session.permanent = True
app.permanent_session_lifetime = timedelta(hours=1)

可是我发现 cookie 这个 2 小时过期是已经实现了,但第二个功能好像并没有实现

我的问题是:
1.如果我两个功能要求的过期时间一样,只配置 cookie 过期时间,能同时实现两个功能吗。
2.如果是我现在要实现的这两个功能,我配置的问题出在哪里。


Python中如何配置Flask的session和cookie过期时间

9 回复

第二个功能,要每次请求之后,通过 js 定时请求,才能判断是不是过期。每次新请求之后,刷新这个 js 定时器就可以了


在Flask里配session和cookie的过期时间,主要得动app.config里的几个参数。直接上代码:

from flask import Flask, session, make_response
from datetime import timedelta

app = Flask(__name__)
app.secret_key = 'your-secret-key-here'  # 必须设置密钥

# 1. 设置session过期时间(服务端)
# PERMANENT_SESSION_LIFETIME 控制session的“永久”过期时间
app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(minutes=30)  # 30分钟后过期

# 2. 设置cookie过期时间(客户端)
# 可以通过设置session.permanent来启用PERMANENT_SESSION_LIFETIME
# 或者直接设置response的cookie

@app.route('/login')
def login():
    session['user'] = 'username'
    session.permanent = True  # 启用PERMANENT_SESSION_LIFETIME设置
    return 'Logged in'

@app.route('/set_cookie')
def set_cookie():
    resp = make_response('Cookie set')
    # 直接设置cookie的过期时间(单位:秒)
    resp.set_cookie('custom_cookie', 'value', max_age=3600)  # 1小时后过期
    # 或者用expires参数(datetime对象)
    # from datetime import datetime
    # resp.set_cookie('custom_cookie', 'value', expires=datetime.now() + timedelta(hours=1))
    return resp

@app.route('/get_session')
def get_session():
    return f"User: {session.get('user', 'Not logged in')}"

if __name__ == '__main__':
    app.run(debug=True)

关键点:

  • PERMANENT_SESSION_LIFETIME:控制session数据的存储时长,需要session.permanent = True才生效
  • max_ageexpires:直接控制cookie在客户端的存活时间
  • 记得设置app.secret_key,不然session没法用

简单说就是服务端session时长用PERMANENT_SESSION_LIFETIME,客户端cookie时长用max_ageexpires

没有用过 flask-login,但是自己写了一套基于 flask 的用户和权限系统,cookie 的有效时间可以在返回的 response 中使用 set_cookie 来设置,其中的第三个参数是有效时间;
在你的问题里面,如果两个时间相同,配置这个就足够了(例如将过期时间配置成 2h );
如果非要让用户在 1h 之内没有任何操作就要登出的话我给你一个思路:加载完毕页面之后前端 setInterval(1h),给后端发一个登出的 ajax 请求,后段返回的请求带上作废 cookie 的请求给浏览器,ajax 完了之后弹个框通知用户已被登出。
当然这只是一个思路,希望能帮到你。

谢谢回复,我想问一下 session.permanent = True
app.permanent_session_lifetime = timedelta(hours=1)这几个配置是在什么情况下用到的呢

#3
官方文档中就有说明:启用 permanent 之后 session lifetime 才会被应用,否则 session 在浏览器关闭时过期(在浏览器端就是 cookies 过期);
建议多看官方文档。

我设置了呀 session.permanent = True

第二个功能,如果是为了安全,那你用 js 完全没有意义,通过修改 js 发送的数据,就可以骗过服务端。
正确的做法是用户每次点击 url 后,都在数据库的用户表里更新时间戳,这样下一次点击 url 就可以对比了

我的理解是这两个功能有冲突,当你这样配置好后,在第二个功能中 1 个小时后虽然“ session ”这个 cookie 失效了,但是,flask_login 还是会从名叫“ remember_token ”的 cookie 中将用户登录信息重新载入到名叫“ session ”的 cookie 中。具体源码可以看一下 flask_login.login_manager._load_user 这个函数

回到顶部