Flask.session在关闭浏览器后保持

Flask.session在关闭浏览器后保持,session,flask,Session,Flask,我希望能够检测用户自上次登录Flask站点以来是否关闭了浏览器。我已经读到Flask会话应该在关闭浏览器时过期,但是会话数据存储在服务器上,据我所知,并且在浏览器会话中持续存在。当用户关闭浏览器时,如何清除所有会话数据 mainapp.py: @mainapp.route('/') def home(): if 'user_name' in session: logger.debug( 'Logged in as {0}'.format(escape(session['u

我希望能够检测用户自上次登录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'
因为使用cookie,所以即使用户关闭窗口,数据也会被持久化。您可以跟踪使用关闭窗口

如果要从会话中删除特定密钥,请执行以下操作:

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)

除非您显式设置
session.permanent=True
,否则会话cookie应在浏览器关闭时过期

参考

从文档中可以看出,与vanilla Flask相反,Flask session中打开的会话在默认情况下是永久的:

默认情况下,Flask会话中的所有非空会话都是永久的

因此,可以尝试根据文档()设置SESSION\u PERMANENT=False?

永久性:

“如果设置为True,会话将持续永久\u会话\u生存时间秒。默认值为31天。如果设置为False(默认值),则当用户关闭浏览器时,会话将被删除。”

在设置会话变量的代码块中,包括以下行:

session.permanent = False
例如


我接受了,因为它回答了这个问题。然而,我认为使用SocketIO降低性能并不能证明它只是用来跟踪关闭浏览器的用户,我不明白。你是说SocketIO的“断开”信号不起作用?它工作正常,我发现当我使用SocketIO时,整个应用程序的速度都变慢了。我不知道你在开发什么类型的应用程序,但保持web套接字打开是有代价的。如果您真的需要跟踪连接,那么这是唯一的方法。但是,如果您可以通过注销或其他方式完成,那么对客户端和服务器来说都会更便宜。指向该页面的链接不再存在。谢谢@DanKing(我已更新了链接以指向最新的docs v1.1)回答得好。注意:文档说False是默认值,但这不是我在测试中遇到的情况。显式地将其设置为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",
        )