Django Session存数据报错解决办法和取数据的问题

来源:互联网 发布:北京网络职业学院招聘 编辑:程序博客网 时间:2024/05/16 16:20

Django Session存对象时

1 当存储普通对象时(Plain Object),提示错误

在StackOverflow上找到出错的原因,原文和翻译如下

原文:
这里写图片描述

翻译:
django中的会话不存储在服务器内存中,因此它们不能包含纯对象。 它们被序列化为可以存储在一些存储后端(数据库,缓存,用户cookie等)中的字符串。

默认情况下,django为会话使用JSON序列化。 JSON序列化程序不能序列化对象。
django中还有另一个序列化程序:pickle。 它可以序列化几乎任何你可以在python中创建,但它有一些缺点。 它更慢,当与任何不受信任的会话存储(如cookie)一起使用时,它可能变得非常严重的安全漏洞,因为它将允许攻击者运行任何代码,只是通过交换序列化的数据。 有关详细信息,请参阅Django docs。

此外,反序列化的pickle将只是尝试重新创建对象状态从它被序列化。 这个对象不会被保存在内存中,所以考虑如果反序列化它从pickle比从头重新创建它更好(像你以前)。

2 存储数字,字符串,列表等可以序列化的基本类型时不报错

在Django官方文档中给出了解释
这里写图片描述

其中说到“A wrapper around the JSON serializer from django.core.signing. Can only serialize basic data types. In addition, as JSON supports only string keys, note that using non-string keys in request.session won’t work as expected:”。就是说来自django.core.signing的JSON序列化程序的包装器。 只能序列化基本数据类型。此外,由于JSON仅支持字符串键,请注意,在request.session中使用非字符串键将无法正常工作:

从Session中取数据时

1 当我们在Session中存的是数字,字符串时,可以正常从Session取出数据

# 在func1中def func1():    request.session['table']=10# 在func2中    def func2():        val=request.session.get('table') # ok val=10

当我们在Session中存的是单个的列表,字典等,可以正常从Session取出数据

# 在func1中def func1():    d={'page':1,'articleType': 'news'}    request.session['table']=d# 在func2中    def func2():        val=request.session.get('table') # ok val={'page':1,'articleType': 'news'}

当我们在Session中存的是包含多个对象的列表或者字典等,也是可以的

# 在func1中def func1():    d1={'page':1,'articleType': 'news'}    d2={'page':2,'articleType': 'novel'}    L=[d1,d2]    request.session['table']=L# 在func2中    def func2():        val=request.session.get('table') # ok val=[{'page':1,'articleType': 'news'},{'page':2,'articleType': 'novel'}]
0 0