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过期时间
第二个功能,要每次请求之后,通过 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_age和expires:直接控制cookie在客户端的存活时间- 记得设置
app.secret_key,不然session没法用
简单说就是服务端session时长用PERMANENT_SESSION_LIFETIME,客户端cookie时长用max_age或expires。
没有用过 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 这个函数

