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?