本文针对django1.4
周末小闲在家研究了下django的 cookie 和 session,所以写点笔记记录下。
我们先从session 讲起:
如果你想用django自带的session库又一下几点选择
首先你要选择一种session的存储模式:
a)database-backed session 存数据库
b)cached sessions 存缓存
c)use file-based sessions 存文件
d)cookie-based sessions 存cookie
其实在cached sessions 还有2种选项(只基于缓存和同时基于缓存和数据库)。
为了演示方便我就挑了 a方案
------------database-backed session 步骤
1 在settings.py的INSTALLED_APPS 中添加一条'django.contrib.sessions'
2 在settings.py 中 DATABASES 的ENGINE 用了 django.db.backends.sqlite3 ,NAME 就随便填了一个文件地址/root/test.db
3 执行 manage.py syncdb 在数据库中创建seesion的表
在view中获取session和修改session信息
def test(request): #获取用户session中的uid属性 uid = request.session.get('uid',None) if uid: print 'session uid:',uid else: #如果session中没有uid就随机生成一个 request.session['uid'] = random.random()
http请求是不带前后语境的,server本身是不知道你是那个用户,你是否是登陆状态。而cookie(客户端)和session(服务器端)的联合就能解决这个麻烦,django默认的做法是在用户第一次访问服务器时会在浏览器 对应host下的cookie中生成一个session的字段,其对应的值是一个加密过的字符串,这个我们可以在浏览器中看到,当然这个sessionid 肯定是唯一的。如下图:
服务器根据这个唯一的sessionid就可以在数据库中检索到对应用户的信息了,所以一个用户的状态都可以以 key value的状态存储在服务器的session里。
接下来我们讲cookie,这个就相对简单了,在前面的session讲解中已经出现了cookie (就是上面的 sessionid),它跟session一样也是key value结构存储的,不过它存在客户端的浏览器中,没一个hostname下一般会有很多cookie存在。
在上面的例子中我们如果手挡将sessionid 这个cookie删除,然后再去访问网站,就会给你生成一个新的,而你无法继续享受之前的sessionid在服务器端中保存的seesion信息了。
上面的sessionid是django帮你自己生成的,作为用户在服务器端中session的唯一标识,我这里说的用户不是登陆注册里面的用户,在一台电脑上如果你开不通的浏览器,生成的session当然也会不同,但是之后你可以用过网站的登陆系统将这两个不通的sessionid跟你的账号来绑定,这就是为什么比如一个微博账号两个浏览器一起登陆不会冲突了,同时能玩。
当然客户端浏览器中的cookie我们也是可以写点别的信息进去的,一般一个cookie的大小限制在4094个字节。
在view中的使用如下:
from django.template import loader ,Context from django.http import HttpResponse def main(request): #不用模板 response= HttpResponse('test') response.set_cookie('my_cookie','cookie value') return response def main(request): #用模板 response= render_to_response('xxxx.html', {}) response.set_cookie('my_cookie','cookie value') return response
结果如下:
获取客户端的cookie:
def mainpage(request): #客户端的cookie会随着每次请求以字典的形式都存在request.COOKIES中 print 'my_cookie',request.COOKIES['my_cookie']
更多django 关于 session和cookie的资料可以看这 https://docs.djangoproject.com/en/1.4/topics/http/sessions/