如何在Django中删除嵌套会话数据?

16 投票
3 回答
25821 浏览
提问于 2025-04-18 17:04

我用 '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 个回答

0

举个例子,在 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
1

我的 request.session['cart'] 是一个列表,像这样: [u'2', u'2', u'1']

所以这个方法对我有效:

list_cart  = request.session['cart']
list_cart.remove('2')

结果是: [u'2', u'1']

18

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,会话不会被保存。

撰写回答