如何在Django中删除嵌套会话数据?
我用 'cart'
这个关键字把数据存到了会话里:
request.session['cart'] = {'8': ['a', 'b'], '9': ['c', 'd']}
然后,我可以用 'cart'
这个关键字删除所有的会话数据:
del request.session['cart']
但是,我无法用 '8'
这个关键字删除 ['a', 'b']
:
del request.session['cart']['8']
那么,我该怎么用 '8'
这个关键字删除 ['a', 'b']
呢?
3 个回答
举个例子,在 test()
函数的任何地方加上 request.session.modified = True
(默认是 False
),就可以保存(或删除)嵌套的会话数据。*会话数据只有在顶层键的数据被修改时才会自动保存。你可以查看 会话何时被保存,还有我在 这个问题 和 这个回答 中解释了会话保存的时机和地点:
# "veiws.py"
from django.http import HttpResponse
def test(request):
request.session.modified = True # Or
del request.session['cart']['8']
request.session.modified = True # Or
return HttpResponse('Test')
另外,在 settings.py
文件中把 SESSION_SAVE_EVERY_REQUEST 设置为 True
,也可以保存(或删除)嵌套的会话数据,如下所示:
# "settings.py"
SESSION_SAVE_EVERY_REQUEST = True
我的 request.session['cart']
是一个列表,像这样: [u'2', u'2', u'1']
所以这个方法对我有效:
list_cart = request.session['cart']
list_cart.remove('2')
结果是: [u'2', u'1']
Django的会话对象只有在被修改时才能保存。但是因为你在会话中修改了一个对象,会话对象并不知道它被修改了,所以它无法保存。
为了让会话对象知道它被修改了,你可以使用:
request.session.modified = True
来自Django文档:
https://docs.djangoproject.com/en/dev/topics/http/sessions/
默认情况下,Django只有在会话被修改时才会保存到会话数据库,也就是说,只有当它的字典值被赋值或删除时,才会保存:
# Session is modified.
request.session['foo'] = 'bar'
# Session is modified.
del request.session['foo']
# Session is modified.
request.session['foo'] = {}
# Gotcha: Session is NOT modified, because this alters
# request.session['foo'] instead of request.session.
request.session['foo']['bar'] = 'baz'
在上面例子的最后一种情况下,我们可以明确告诉会话对象它已经被修改,通过设置会话对象的modified属性:
request.session.modified = True
如果想改变这个默认行为,可以把SESSION_SAVE_EVERY_REQUEST设置为True。设置为True后,Django会在每一次请求时都保存会话到数据库。
需要注意的是,只有在会话被创建或修改时,才会发送会话cookie。如果SESSION_SAVE_EVERY_REQUEST为True,会话cookie会在每次请求时发送。
同样,每次发送会话cookie时,cookie的过期时间部分也会被更新。
如果响应的状态码是500,会话不会被保存。