【问题标题】:Flask.session persisting after close browser关闭浏览器后 Flask.session 持续存在
【发布时间】:2016-09-10 16:48:06
【问题描述】:

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

【问题讨论】:

    标签: session flask


    【解决方案1】:

    因为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)
    

    【讨论】:

    • 我接受了,因为它回答了这个问题。但是,我认为使用 SocketIO 会降低性能并不能证明它仅用于跟踪关闭浏览器的用户。
    • 我不明白。你的意思是 SocketIO“断开”信号不起作用?
    • 它工作正常,我发现当我使用 SocketIO 时整个应用程序变慢了。
    • 我不知道您正在开发什么类型的应用程序,但保持 Web 套接字打开是有代价的。如果您确实需要跟踪连接,那么这是唯一的方法。但是,如果您可以通过注销或其他方式来做到这一点,那么客户端和服务器都会更便宜。
    【解决方案2】:

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

    参考Flask documentation on session.permanent

    【讨论】:

    • 该页面的链接已不存在。
    • 感谢@DanKing(我已更新链接以指向最新的文档 v1.1)
    【解决方案3】:

    似乎与原版 Flask 不同,Flask-session 中打开的会话默认是永久的,来自文档:

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

    所以也许尝试设置 SESSION_PERMANENT=False?

    【讨论】:

    • 好答案。注意:文档说 False 是默认设置,但这不是我在测试中遇到的情况。将其显式设置为 False 对我有用(您的答案和我上面的答案)。
    【解决方案4】:

    根据文档 (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",
            )
    

    【讨论】:

      猜你喜欢
      • 2012-08-31
      • 1970-01-01
      • 1970-01-01
      • 2012-12-28
      • 1970-01-01
      • 2015-11-15
      • 2011-12-17
      • 2012-04-11
      相关资源
      最近更新 更多