我正在使用django实现基本的登录和注销页面。我的登录功能在db中的django_session表中添加了一行。但是,当我注销时,它不会删除会话行。由于会话不再有效并且从请求中删除了所有与会话相关的数据,因此注销功能是否也应该从django_session表中删除会话行?
这是我的退出功能:
@login_required
def logout_student(request):
logout(request)
# Redirect to a success page.
return HttpResponseRedirect('/index/')
感谢您的帮助。
答案 0 :(得分:4)
如果您在登录时手动向django_session
添加一行,然后在django.contrib.auth.logout()
,request.session.flush()
)功能将仅删除具有相同主要内容的行key session_key
作为django_session
表的当前会话密钥。
request.session.flush()
用于确保无法再从用户的浏览器访问以前的会话数据。它基本上做了两件事:
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)
在数据库级别操作会话真的很奇怪。在注销时删除或无效会话对我来说没有意义。我还建议使用Django通用logout view或django-registration并处理信号中的自定义逻辑(如果有的话)