2

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

这是我的注销功能:

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

谢谢你的帮助。

4

3 回答 3

4

如果您django_session在登录时手动添加一行,则在django.contrib.auth.logout(), request.session.flush()) 函数只会session_key从表中删除与当前会话键具有相同主键的行django_session

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

  1. 从数据库中删除当前会话数据(或缓存,取决于您为会话后端选择哪一个)。
  2. 重新生成在 cookie 中发送回用户的会话密钥值。

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在用户注销时删除行。

于 2012-09-25T00:55:14.000 回答
3

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

于 2012-09-24T23:47:52.903 回答
0
  • 用户注销时会话既不会被删除也不会失效。会话数据(例如用户设置的语言)仍可根据要求提供
  • 会话仅在过期或删除(自动或手动)时才变为无效
  • 要清理过期的会话,请运行./manage.py cleanup

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

于 2012-09-25T00:48:39.917 回答