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

Python 使用request.session.flush()和简单地使用del request.session[';key';]在Django中注销用户有什么区别?,python,django,Python,Django,我使用了以下方法: def LogOut(request): request.session.flush() def LogOut(request): try: del request.session['member_id'] except KeyError: pass 我查找了数据库文件,发现前者确实从数据库中删除了会话数据 然而,后者却没有。 我无法理解两者之间的区别。为什么第二个不删除会话数据,即使我在创建会话时已将成员id分配给上述密钥。

我使用了以下方法:

 def LogOut(request):
   request.session.flush()

 def LogOut(request):
   try:
      del request.session['member_id']
   except KeyError:
      pass
我查找了数据库文件,发现前者确实从数据库中删除了会话数据 然而,后者却没有。 我无法理解两者之间的区别。为什么第二个不删除会话数据,即使我在创建会话时已将成员id分配给上述密钥。

区别在于

  • request.session.flush()。而
    del request.session['member\u id']
    仅使用键
    member\u id
    删除会话值

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

    您可以查看
    django_session
    表上的
    session_数据。它是base64值,您可以解码该值,并查看实际值。您将看到该
    会话数据上不存在
    成员id
    ,但会话记录仍然存在


  • 因为第二个只是操作pythonlist变量,而第一个是对表执行sqldelete查询。如果您需要了解
    request.session.flush()
    ,则需要查看核心源代码。您会发现它确实在表上执行sql delete查询。

    那么第二个查询究竟删除了什么?我知道这是一个键值对,但是键值对意味着什么?对不起,我的意思是第二个键值对不会从数据库中删除会话记录,但它会从特定会话记录的会话数据中删除该键值。我认为您需要了解会话是如何工作的,特别是在Django中。会话在开始时从DB加载(因为您使用DB作为会话后端),然后在请求结束时将会话存储(更新)回DB。当您删除该密钥时,当会话得到更新时,它不包括该密钥,因为它正在被删除。会话密钥通常包含什么?请澄清,您可以从
    django\u session
    DB检查会话数据的一条记录。它只是base64值。您可以解码base64值,然后可以看到真正的值是什么。del是一个Python构造,它与数据库无关。从RAM中删除数据不会改变它存储在数据库中的事实。
    Why doesn't the second remove the session data?