【问题标题】:session flush is not working django会话刷新不起作用 django
【发布时间】:2015-06-05 12:24:14
【问题描述】:

当用户不想保持登录状态时,我正在尝试刷新所有会话数据。

在views.py中

def login(request, *args, **kwargs):
    if request.method == 'POST':        
        if not request.POST.has_key('remember_me'):      
            request.session.flush()

    return auth_views.login(request, *args, **kwargs)

但是当我尝试访问该站点时,它仍然显示用户已登录。这有什么问题?

【问题讨论】:

    标签: python django session


    【解决方案1】:

    据我了解,如果用户不检查 Remember me - 如果用户的浏览器关闭,您需要使会话 cookie 过期

    这可以使用set_expiry(0)来实现:

    设置会话的过期时间。您可以传递许多不同的值:

    • ...
    • 如果值为 0,则用户的会话 cookie 将在用户的 Web 浏览器关闭时过期。

    用法:

    request.session.set_expiry(0)
    

    另见:

    【讨论】:

    • 这就是我的意思,但是 set_expiry(0) 没有按我的意思工作。默认值是 300 秒,5 分钟,对吗?并且 Chrome 有问题。它在重新打开时显示用户。所以,我尝试使用不同的方式。
    • @user2307087 理解。请出示您的INSTALLED_APPSMIDDLEWARE_CLASSES 设置。
    • 我使用的是标准设置,所以在这里。 MIDDLEWARE_CLASSES = ('django.middleware.common.CommonMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django. contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', )
    • @user2307087 我需要确保SessionMiddleware 已激活。好的,您是否定义了 SESSION_EXPIRE_AT_BROWSER_CLOSESESSION_COOKIE_AGE 设置?
    • 我已设置 SESSION_EXPIRE_AT_BROWSER = True , SESSION_COOKIE_AGE = 60*60*24*7*4(4 周)。
    【解决方案2】:

    您可能已经尝试过,但如果您使用的是django.contrib.auth.views,那么您可以尝试调用django.contrib.auth.logout(request) 注销用户(如果他们不想被记住),然后按照您现有的代码登录:

    from django.contrib.auth import logout
    
    def login(request, *args, **kwargs):
        if request.method == 'POST':        
            if not request.POST.has_key('remember_me'):
                saved_user = getattr(request, 'user', None)
                logout(request)
                if saved_user is not None:
                    request.user = saved_user
    
        return auth_views.login(request, *args, **kwargs)
    

    这应该可以工作,因为 django.contrib.auth.login() 在幕后被调用。文档说会话已被清除。

    【讨论】:

    • 不,它不起作用。我将到期时间设置为 1 秒。谢谢大家。
    【解决方案3】:

    我认为解决该问题的最简单方法是使用 django-session-security 它在注销用户之前警告用户 它从用户的最后一次活跃(例如:屏幕移动)开始计算会话。

    【讨论】:

      猜你喜欢
      • 2012-08-30
      • 1970-01-01
      • 1970-01-01
      • 2022-08-18
      • 2012-11-17
      • 2021-05-19
      • 2016-08-26
      • 2011-06-11
      • 2014-05-15
      相关资源
      最近更新 更多