我希望能够检测用户自上次登录Flask网站后是否关闭了浏览器。我已经读过Flask会话应该在关闭浏览器时到期,但会话数据存储在服务器上,据我所知,并且在浏览器会话中持续存在。如何在用户关闭浏览器时清除所有会话数据?
mainapp.py:
@mainapp.route('/')
def home():
if 'user_name' in session:
logger.debug( 'Logged in as {0}'.format(escape(session['user_name'])))
return render_template('home.html')
userviews.py:
@userviews.route("/login", methods=["GET", "POST"])
def login():
form = LoginForm(request.form)
if form.validate_on_submit():
#get user from db
session['user_name'] = user.user_name
setup.py:
app.secret_key = 'somethingreallysecret'
答案 0 :(得分:2)
由于flask session使用Cookie,即使用户关闭窗口,数据也会保留。您可以使用Flask-SocketIO跟踪关闭窗口的使用情况。
如果要从会话中删除特定密钥:
from flask import session
from flask_socketio import SocketIO, emit
from flask.ext.login import current_user, logout_user
app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret!'
socketio = SocketIO(app)
@socketio.on('disconnect')
def disconnect_user():
logout_user()
session.pop('yourkey', None)
答案 1 :(得分:1)
除非您明确设置session.permanent = True
,否则会话cookie应在浏览器关闭时过期。
答案 2 :(得分:0)
与vanilla Flask相反,在Flask会话中打开的会话默认是永久性的,来自文档:
默认情况下,Flask-Session中的所有非空会话都是永久性的。
所以也许尝试设置SESSION_PERMANENT = False?
答案 3 :(得分:0)
根据文档 (https://flask.palletsprojects.com/en/1.1.x/api/#flask.session.permanent):
永久:
"如果设置为 True,会话将持续 permanent_session_lifetime 秒。默认值为 31 天。如果设置为 False(这是默认值),会话将在用户关闭浏览器时被删除。 "
在设置会话变量的代码块中包含以下行:
session.permanent = False
例如
@app.route("/login", methods=["GET", "POST"])
def login() -> "html":
if request.method == "GET":
return render_template(
"login.html",
)
else:
# Process login form...
# ...then set session variable
session.permanent = False
session["username"] = "some value"
return render_template(
"some_secure_page.html",
)