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_ageexpires参数,让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)

简要说明:

  1. app.config['PERMANENT_SESSION_LIFETIME'] 设置了持久会话在服务器端的最大存储时间。
  2. session.permanent = True 告诉Flask使用上述持久化配置,并会在响应的Set-Cookie头中将会话cookie的过期时间设置为未来的一个日期(而不是会话结束时),从而实现浏览器关闭后cookie依然有效。

一句话总结: 设置PERMANENT_SESSION_LIFETIME并标记session.permanent = True即可。


会话 cookie 和持久性 cookie

回到顶部