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'}]