## session
[django1.8.2 session官方中文文档][1]
session 是一个抽象概念,开发者为了实现中断和继续等操作,将 user agent 和 server 之间一对一的交互,抽象为“会话”,进而衍生出“会话状态”,也就是 session 的概念。
### 定义
在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下)。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中,当用户使用浏览器访问其它程序时,其它程序可以从用户的session中取出该用户的数据,为用户服务。
需要注意:**新开的浏览器窗口会生成新的Session**,但子窗口除外。子窗口会共用父窗口的Session。例如,在链接上右击,在弹出的快捷菜单中选择"在新窗口中打开"时,子窗口便可以访问父窗口的Session。
由于HTTP协议是`无状态`的协议,所以服务端需要记录用户的状态时,就需要用某种机制来识具体的用户,这个机制就是Session。典型的场景比如购物车。当你点击下单按钮时,由于HTTP协议无状态,所以并不知道是哪个用户操作的,所以服务端要为特定的用户创建了特定的Session,用用于标识这个用户,并且跟踪用户,这样才知道购物车里面有几本书。这个Session是保存在服务端的,有一个唯一标识。在服务端保存Session的方法很多,内存、数据库、文件都有。集群的时候也要考虑Session的转移,在大型的网站,一般会有专门的Session服务器集群,用来保存用户会话,这个时候 Session 信息都是放在内存的,使用一些缓存服务比如Memcached之类的来放 Session。
### 用途
Session可以记录用户的`登录与行为数据`,即记录下用户目前访问服务器上的那些内容,状态是什么,而考虑到这些数据用户修改的随意性很大,并没有必要直接存储在数据库中。
在用户执行刷新操作时,即再次访问服务器时,可以直接根据Session,打开用户上次访问时网页的状态(如用户输入的表单内容等等),为用户带来更优的体验,提供个性化服务。
用户的session信息非常关键,它记录了用户在进入页面、查看结果、点击结果以及后继的操作(比如翻页、加购物车等)。只有通过session信息才能把用户的行为联系起来,构建出完整的模型,因此从海量数据中把每一个用户所有session的操作都完整地挖掘出来非常重要。
简单通俗的讲session就是象一个临时的容器 来存放这些临时的东西 从你登陆开始就保存在session里 当然你可以自己设置它的有效时间和页面。举个简单的例子 我们做一个购书的JSP网站 顾客买书的时候会挑选出一些书 但是在付钱之前还可以修改,所以不能存到数据库 就可以先保存在session里 等到确认了以后再放入数据库
### session实现方式
cookie实现会话管理
一般只将session的id存储在cookie中
URL重写实现会话管理
URL重写就是将需要记录的信息附加在请求的链接背后,以链接参数的形式发送给服务器识别。具体实现的过程会在后文结合cookie详解。
### session和cookie的有效时长
session和cookie的有效时长session的有效时长服务器会把长时间没有活动的Session从服务器内存中清除,此时Session便失效。具体根据服务器设置,一般在二三十分钟左右。
cookie的有效时长cookie的内容主要包括:名字,值,过期时间,路径和域。路径与域一起构成cookie的作用范围。通过过期时间可以设置cookie的有效时长若不设置过期时间: 表示这个cookie的生命周期为浏览器回话期间,关闭访问服务器的浏览器窗口,cookie就消失了。一般称为回话cookie,保存在内存中若设置了过期时间:则cookie会存储在硬盘上,直到超过有效时间。
## 配置和用法
Django中默认支持Session,其内部提供了5种类型的Session供开发者使用:
* 数据库(默认)
* 缓存
* 文件
* 缓存+数据库
* 加密cookie
### 配置
缓存的设置 http://python.usyiyi.cn/translate/django_182/topics/cache.html
在settings.py中
#### 公共部分-默认值
~~~
SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串
SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径
SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名
SESSION_COOKIE_SECURE = False # 是否Https传输cookie
SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输
SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)
SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期
SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存
~~~
#### 不同部分
~~~
# 数据库引擎(默认)
SESSION_ENGINE = 'django.contrib.sessions.backends.db'
# 缓存Session引擎
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
SESSION_CACHE_ALIAS = 'default' # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置
# 缓存+数据库Session 引擎
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'
# 文件Session引擎
SESSION_ENGINE = 'django.contrib.sessions.backends.file'
SESSION_FILE_PATH = None # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir()
# 加密cookie Session引擎
SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'
~~~
### 用法
~~~
## 对单个键值对操作
# 获取Session中指定key的值
request.session['key']
request.session.get('key',None)
# 设置或者更新key的值
request.session['key'] = 123
# 设置key的值,存在则不设置,相当于设置默认值
request.session.setdefault('key',123)
# 删除指定key的值
del request.session['key']
# 删除当前用户的所有Session数据
request.session.delete("session_key")
# 清除用户的sesseion数据,用户logout
request.session.clear()
# 获取用户session的随机字符串
request.session.session_key
# 将所有Session失效日期小于当前日期的数据删除
request.session.clear_expired()
# 检查 用户session的随机字符串 在数据库中是否
request.session.exists("session_key")
## 对所有键值对操作
request.session.keys()
request.session.values()
request.session.items()
request.session.iterkeys()
request.session.itervalues()
request.session.iteritems()
request.session.set_expiry(value)
* 如果value是个整数,session会在些秒数后失效。
* 如果value是个datatime或timedelta,session就会在这个时间后失效。
* 如果value是0,用户关闭浏览器session就会失效。
* 如果value是None,session会依赖全局session失效策略。
~~~
[1]:http://python.usyiyi.cn/translate/django_182/topics/http/sessions.html