使用 request.session.flush() 和简单地使用 del request.session['key'] 在 Django 中注销用户有什么区别?



我使用了以下内容:

def LogOut(request):
request.session.flush()
def LogOut(request):
try:
del request.session['member_id']
except KeyError:
pass

我查找了数据库文件,并注意到前者确实从中删除了会话数据 然而,后者没有。 我无法理解两者之间的区别。为什么第二个不删除会话数据,即使我在创建会话时已将成员的 ID 分配给上述密钥。

区别在于,

  1. request.session.flush()是删除该请求上的所有会话值。 而del request.session['member_id']仅删除具有键member_id的会话值。

  2. 如您所见,request.session.flush()也会从数据库中删除数据,而del request.session['member_id']则不会。request.session.flush()从表中删除django_session记录。但是,del request.session['member_id']仅删除特定会话记录上具有键member_id的会话数据。

    你可以看看django_session桌上的session_data。它是base64值,你可以解码该值,看看真正的值是什么。您将看到该session_data上不存在member_id,但会话记录仍然存在。

Why doesn't the second remove the session data?

因为第二个只是操作python列表变量,而第一个是对表执行sql删除查询。如果你需要了解request.session.flush(),你需要看看核心源代码。您会发现它确实对表执行 sql 删除查询。

最新更新