Dongxing's Wiki Dongxing's Wiki
首页
  • 剑指 Offer
  • LeetCode
  • 算法与数据结构
  • Python 语言
  • Web 开发
  • Hive
  • Elastic Search
  • 机器学习
  • NLP
  • 检索技术
  • 数据分析
  • 经验笔记
  • Linux 配置
  • 博客进化记
  • 杂谈
GitHub (opens new window)
首页
  • 剑指 Offer
  • LeetCode
  • 算法与数据结构
  • Python 语言
  • Web 开发
  • Hive
  • Elastic Search
  • 机器学习
  • NLP
  • 检索技术
  • 数据分析
  • 经验笔记
  • Linux 配置
  • 博客进化记
  • 杂谈
GitHub (opens new window)
  • 语法

    • conda常用命令整理
    • Python、Django 中使用 logging 便捷处理日志记录
    • Python 中的 is 和 ==
    • Python 中的堆和优先队列
  • Web

    • 使用django快速搭建微信公众号后台服务
    • Django 常用操作笔记
    • 使用haystack实现django全文检索搜索引擎功能
    • django session何时被修改
  • Python
  • Web
anthony
2018-01-16

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

根据上面的说明,只有对session进行字典的插入、修改、删除时才会认为改变了session,从而进行保存。第四种情况,只是对某个对象的修改,未直接改变session,所以没有被保存。

有一些办法解决: 1)把原来的修改方式,换成对字典的修改

2)可以显式声明对session进行了修改:

request.session.modified = True
1

3)可以设置在每次请求时都保存session。在settings里

SESSION_SAVE_EVERY_REQUEST = True
1

但感觉这种方式可能性能会受不小影响。

此外,还可通过改变session的存储方式,来实现一些优化。

Django中的Session有3种存储方式:放在数据库、缓存或者文件系统中,下面分别予以介绍。

  1. 将Session存储在数据库中: 如果要将Session存储在数据库中,我们需要将 ’django.contrib.sessions’ 加入到INSTALLED_APPS 变量中。然后运行 manage.py syncdb 在数据库中创建相应的存储Session的数据库表。
  1. 将Session存储在缓存中: 如果想获得更好的性能,我们可以将Session保存在缓存中。这里有两种配置方式:一种是设置SESSION_ENGINE 为”django.contrib.sessions.backends.cache” 。这是一种简单配置,Session将之被保存在缓存中,但是不保证Session总是能取到(比如缓存溢出时Session会丢失);另一种方式是设置SESSION_ENGINE 为 “django.contrib.sessions.backends.cached_db”。这种方式下,Session在保存到缓存的同时还会被保存到数据库中,当Django在缓存中找不到Session时,会从数据库中找到。第二种方式会有一点点性能开销,但是安全性和冗余性更好。
  1. 将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
使用haystack实现django全文检索搜索引擎功能

← 使用haystack实现django全文检索搜索引擎功能

Theme by Vdoing | Copyright © 2017-2023 anthony 京ICP备17072417-3
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式