小谈django 的 cookie和session

本文针对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 肯定是唯一的。如下图:

session

服务器根据这个唯一的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

获取客户端的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/

猜你喜欢

转载自pako.iteye.com/blog/1722625