Flask.session在关闭浏览器后持续存在

时间:2016-05-14 14:20:30

标签: session flask

我希望能够检测用户自上次登录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'

4 个答案:

答案 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应在浏览器关闭时过期。

<强>参考Flask documentation on session.permanent

答案 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",
        )