想象一个情景,我们在逛淘宝时,首先浏览器会先我登录用户,并且把数据传入服务器,可是如果服务器没有合适的方法来储存处理这些数据,等到我们要下订单付款时浏览器要是把我们的账户忘了,那将会造成很不好的消费体验,因此,Django等大部分框架都提供了Cookies和session技术来处理这个问题。
Cookies
当浏览器向服务器发送请求时,服务器会将一些数据传回浏览器并储存在浏览器内部的内存中,这部分内存叫做cookies,每次发送请求时浏览器都会将一些数据上传到服务器来供服务器使用。 在配置路由函数时,可以将响应对象在返回前,调用相应的函数来对cookies中的cookie数据进行“增删改查”:
set_cookie() 为增加或者更新数据时用到的函数,其主要用到的参数有:
- key: 设置cookie的键
- value: 设置cookie的值
- max_age: 该条cookie在浏览器中从生成开始保留多久,单位秒(s)
request.COOKIES 用法和GET\POST 一致,可以通过cookie的key 值访问其value delete_cookie(key) 和set_cookie 用法一致,传入key值删除此条cookie数据
Session
前面的cookie很明显有一定的缺陷,如果服务器把交互数据等都储存在浏览器的cookie中,其一安全性不足,如果有密码等隐私数据,用js 等就可以很轻易的取出或修改,再者刚才说了浏览器每次提交请求时都会把cookies数据全部上传到服务器,数据一旦多起来,便会造成速度变慢等问题,而session就是解决这个问题的。 session将一个浏览器发起请求所提交的数据在服务器的数据库内开辟一块内存来专门储存这个客户端,而服务器每次收到请求后都会将一个叫sessionid 的值传回cookie,这个值就相当于一把钥匙,能够打开这块数据库的区域来访问里面的数据,每个客户端之间的信息是封闭的,即储存区域,sessionid不一样。 而session的增删改查均是以类似字典形式来进行的,这个“字典”即request.session 比如要增加一个key为’username’的值’Marconi’ 即request.session['username'] = 'Marconi'
- 像cookies一样,session也需要设置sessionid在cookies中保存的时间,默认为14天,我们也可以在
settings.py 文件中增加配置项SESSION_COOKIE_AGE = time 单位为秒。 - 过期的session由于各种原因,数据库无法判断是否应该删除这些数据,因此我们需要养成习惯,每晚通过命令手动删除这些过期数据
python3 manage.py clearsessions
|