django身份验证注销功能是否删除了django_session表中的会话行?

时间:2012-09-24 23:45:19

标签: python django

我正在使用django实现基本的登录和注销页面。我的登录功能在db中的django_session表中添加了一行。但是,当我注销时,它不会删除会话行。由于会话不再有效并且从请求中删除了所有与会话相关的数据,因此注销功能是否也应该从django_session表中删除会话行?

这是我的退出功能:

@login_required
def logout_student(request):
    logout(request)
    # Redirect to a success page.
    return HttpResponseRedirect('/index/')

感谢您的帮助。

3 个答案:

答案 0 :(得分:4)

如果您在登录时手动向django_session添加一行,然后在django.contrib.auth.logout()request.session.flush())功能将删除具有相同主要内容的行key session_key作为django_session表的当前会话密钥。

request.session.flush()用于确保无法再从用户的浏览器访问以前的会话数据。它基本上做了两件事:

  1. 从数据库中删除当前会话数据(或缓存,取决于您为session backends选择的数据)。
  2. 重新生成在cookie中发回给用户的会话密钥值。
  3. Django源代码django.contrib.auth.logout()

    def logout(request):
        """
        Removes the authenticated user's ID from the request and flushes their
        session data.
        """
        # Dispatch the signal before the user is logged out so the receivers have a
        # chance to find out *who* logged out.
        user = getattr(request, 'user', None)
        if hasattr(user, 'is_authenticated') and not user.is_authenticated():
            user = None
        user_logged_out.send(sender=user.__class__, request=request, user=user)
    
        request.session.flush()
        if hasattr(request, 'user'):
            from django.contrib.auth.models import AnonymousUser
            request.user = AnonymousUser()
    

    基于数据库的会话的删除方法:

    def delete(self, session_key=None):
        if session_key is None:
            if self.session_key is None:
                return
            session_key = self.session_key
        try:
            Session.objects.get(session_key=session_key).delete()
        except Session.DoesNotExist:
            pass
    

    要删除手动添加的行,您可以使用Django信号django.contrib.auth.signals.user_logged_out删除用户注销时的行。

答案 1 :(得分:3)

它不会删除会话行,因此可以在以后审核会话。您必须使用(例如)自定义管理命令和cron。

手动清理行

答案 2 :(得分:0)

    用户注销时,
  • 会话既不会被删除也不会失效。会话数据(例如用户设置语言)仍可在请求中使用
  • 会话仅在过期或删除(自动或手动)时失效
  • 清理过期的会话,运行 ./ manage.py cleanup

在数据库级别操作会话真的很奇怪。在注销时删除或无效会话对我来说没有意义。我还建议使用Django通用logout viewdjango-registration并处理信号中的自定义逻辑(如果有的话)