django session何时被修改
在用django做项目的时候遇到一点点小问题,例如下面的代码:
req.session['student_answer'].time_used = 12
1
这样的修改,虽然赋值成功,但别处取用session时,仍然是原来的值。 参阅django文档,发现django中何时保存session的相关说明:
https://docs.djangoproject.com/en/1.11/topics/http/sessions/#when-sessions-are-saved
# 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'
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
根据上面的说明,只有对session进行字典的插入、修改、删除时才会认为改变了session,从而进行保存。第四种情况,只是对某个对象的修改,未直接改变session,所以没有被保存。
有一些办法解决: 1)把原来的修改方式,换成对字典的修改
2)可以显式声明对session进行了修改:
request.session.modified = True
1
3)可以设置在每次请求时都保存session。在settings里
SESSION_SAVE_EVERY_REQUEST = True
1
但感觉这种方式可能性能会受不小影响。
此外,还可通过改变session的存储方式,来实现一些优化。
Django中的Session有3种存储方式:放在数据库、缓存或者文件系统中,下面分别予以介绍。
- 将Session存储在数据库中: 如果要将Session存储在数据库中,我们需要将 ’django.contrib.sessions’ 加入到INSTALLED_APPS 变量中。然后运行 manage.py syncdb 在数据库中创建相应的存储Session的数据库表。
- 将Session存储在缓存中: 如果想获得更好的性能,我们可以将Session保存在缓存中。这里有两种配置方式:一种是设置SESSION_ENGINE 为”django.contrib.sessions.backends.cache” 。这是一种简单配置,Session将之被保存在缓存中,但是不保证Session总是能取到(比如缓存溢出时Session会丢失);另一种方式是设置SESSION_ENGINE 为 “django.contrib.sessions.backends.cached_db”。这种方式下,Session在保存到缓存的同时还会被保存到数据库中,当Django在缓存中找不到Session时,会从数据库中找到。第二种方式会有一点点性能开销,但是安全性和冗余性更好。
- 将Session存储在文件系统中: 最后一种方式是将Session存储在文件系统中。需要设置SESSION_ENGINE 为”django.contrib.sessions.backends.file”,这时你还需要同时设置SESSION_FILE_PATH 变量,它代表Session文件保存的位置,缺省的设置一般是tempfile.gettempdir(),表示系统的临时目录。这里要确保应用程序对那个目录有读写的权限。
ref: http://blog.csdn.net/clh604/article/details/9186465
上次更新: 2020/09/19, 22:09:00