Python中Flask如何在关闭浏览器后保存登录状态
按照《 Flask Web Development 》的内容,使用 Flask-Login,登录时勾选 remember_me 的情况下,重新打开浏览器后,只有在第一次打开"/"路径的时候登录状态还在。随便点击一个链接,登录状态就不见了。
本来以为是自己代码写的有问题,直接 clone 书里提到的仓库 https://github.com/miguelgrinberg/flasky 在我电脑里也是不成功。
Python中Flask如何在关闭浏览器后保存登录状态
2 回复
Flask默认的会话机制(session)依赖客户端cookie,浏览器关闭后会话cookie(session cookie)默认会失效,导致登录状态丢失。要实现关闭浏览器后保持登录状态,你需要使用持久会话(Persistent Session)。
核心方法是设置会话cookie的max_age或expires参数,让cookie在浏览器关闭后依然保留。同时,确保session.permanent = True,这样Flask会使用PERMANENT_SESSION_LIFETIME配置的过期时间。
关键代码示例:
from flask import Flask, session, request, jsonify
from datetime import timedelta
app = Flask(__name__)
app.secret_key = 'your-secret-key-here' # 必须设置密钥
# 设置持久会话的生存周期,例如31天
app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(days=31)
@app.route('/login', methods=['POST'])
def login():
# 假设验证通过后
session['user_id'] = 'some_user_id'
session.permanent = True # 标记会话为持久
return jsonify({'status': 'logged in'})
@app.route('/check')
def check_login():
user_id = session.get('user_id')
if user_id:
return jsonify({'user_id': user_id})
return jsonify({'status': 'not logged in'})
if __name__ == '__main__':
app.run(debug=True)
简要说明:
app.config['PERMANENT_SESSION_LIFETIME']设置了持久会话在服务器端的最大存储时间。session.permanent = True告诉Flask使用上述持久化配置,并会在响应的Set-Cookie头中将会话cookie的过期时间设置为未来的一个日期(而不是会话结束时),从而实现浏览器关闭后cookie依然有效。
一句话总结: 设置PERMANENT_SESSION_LIFETIME并标记session.permanent = True即可。
会话 cookie 和持久性 cookie

