怎么使用django的session模块
session主要是用来管理用户访问状态的。在HTTP无状态的特性下,session使用户在服务器端有了状态,减少了验证流程,提高响应效率。django本身已经封装了管理session的模块,我们来看看他是怎么样的吧。
session模块的启动与关闭
django的session管理模块,是通过中间件的方式配置使用的。
- 使用
在xxx/xxx/setting.py文件的 MIDDLEWARE变量中,添加django.contrib.sessions.middleware.SessionMiddleware。如果你是通过命令创建的项目,这个参数已经自动添加
- 不使用
如果你不需要session模块的话,最好移除MIDDLEWARE中的django.contrib.sessions.middleware.SessionMiddleware
,以及 INSTALLED_APPS中的django.contrib.sessions
。
这样会减少你系统的运行开销。提高效率
配置session存储形式
session的存储方式有很多种,如数据库存储,缓存存储以,文件存储以及cookie存储。session都有相对应的机制进行管理。
django默认使用的是数据库存储。
session 使用哪种机制,是通过 SESSION_ENGINE 参数控制的。
默认的参数就是 django.contrib.sessions.backends.db 即,数据库存储
-
数据库存储
- 配置
xxx/xxx/setting.py中的INSTALLED_APPS添加django.contrib.sessions
- 执行
添加好之后,执行python manage.py migrate
这个命令会扫描项目中的model,生成对应的表。
这里就相当于,重新扫描项目中所有的mode,并创建django.contrib.sessions.models.Session相关的数据库语句
- 配置
-
缓存存储
首先你要确认你启动了缓存机制。
默认session存储在default对应的缓存中。
如果你有多个缓存,可以在SESSION_CACHE_ALIAS中指定,你的session使用哪个缓存。
然后,如果你设置了缓存机制的session,你有两种存储session的方式可以选择。- django.contrib.sessions.backends.cache 将session存储在缓存中
- django.contrib.sessions.backends.cached_db 将session存储在缓存及数据库中,各一份。
两种方式都是配置的SESSION_ENGINE 变量。第二种方式的目的,是在于session的持久化保存,防止系统重启后,session丢失。
在官方文档中有这么一个警告。
You should only use cache-based sessions if you’re using the Memcached cache backend. The local-memory cache backend doesn’t retain data long enough to be a good choice, and it’ll be faster to use file or database sessions directly instead of sending everything through the file or database cache backends. Additionally, the local-memory cache backend is NOT multi-process safe, therefore probably not a good choice for production environments
我的理解是这样的。
如果您使用的是Memcached缓存后端,则仅应使用基于缓存的会话。
意思应该是就是,如果你使用django的cache-based session机制,最好使用Memcached缓存机制。
django的缓存机制中,有基于内存、数据库、文件系统的缓存机制
如果你想要使用基于缓存session机制,目的应该就是缓存机制的效率。
所以两种基于内存的缓存机制 Memcached 和 local-memory 是比较合适的
在这两个缓存机制中,最好是使用Memcached缓存机制。
因为local-memory 缓存机制,是单进程,且线程安全的,不支持多进程通信。
而导致session在一个进程中登录之后,在另一个进程中session失效的问题。这里其实并不是很懂,django并发机制
-
文件session
- 配置SESSION_ENGINE 为 django.contrib.sessions.backends.file
- 通过 SESSION_FILE_PATH 来设置session文件路径。默认是tempfile.gettempdir()返回的路径。
-
cookie session
- 配置SESSION_ENGINE 为 django.contrib.sessions.backends.signed_cookies