django的cookie和session

一:cookie:

       cookies是保存在浏览器的一对键值对。

  可以称作浏览器缓存。cookie在计算机中是个存储在浏览器目录中的文本文件,当浏览器运行的时候,存储在RAM中的发挥作用(此种cookies称作为sion Cookies),一旦用户从该网站或服务器退出,Cookie可存储在本地硬盘上(此种Cookies 称作Persistent  Cookies)。

通常情况下,当用户结束浏览器会话的时候,系统将终止所有的Cookie  。当WEB服务器创建了Cookies后,只要在其 有效期内,当用户访问同一个WEB服务器时候,浏览器首先要检车本地的Cookies,并将其原样发送给Web服务器,这种状态信息称作Cookies.

在Internet中,Cookie实际上指小量的信息,是由WEB服务器创建的,将信息存储在用户计算机上的文件。一般网络用户习惯用其复数形式的Cookies,指某些网站为了辨别用户身份。进行session跟踪而存储在用户的本地终端的数据,而这些数据通常是经过加密码处理的

chrom浏览器的cookie存储在:

1 C:\Documents and Settings\Administrator\Local Settings\Application Data\Google\Chrome\User Data\Default

 

因为HTTP请求是短连接请求,那网站怎么判断我的在网页的操作的是哪个用户呢?

现在大多数的网站都是应用cookie和session 来保存用户的登录信息以及会话保持。

现在我们来禁用cookie看下京东或者天猫是否可以登录。

效果:

Cookie和session关系:

客户端浏览器接收WEB服务器发送的随机字符串并存储在本地浏览器cookie中。而服务器存储相关的用户的信息叫做session,session可以存储在数据库(django中默认是存储在数据库中),可以储存在其他的地方中。

当客户端再次发送请求的时候,客户端会携带这个随机字符串,服务器端会从相应的“地方”并且在有效期内的相应的字符串进行进行比对,判断用户的登录状态。

以python字典的方式存储在浏览器中。

二:模拟设置cookie:设置cookie的时候,是在返回对象中进行设置的。

def cookie(request):
    obj=render(request,'cookie.html')#返回对象的设置cookie
    obj.set_cookie('k1','v1')#设置key,value形式。
    return obj

 

浏览器:

set_cookie:参数

1   def set_cookie(self, key, value='', max_age=None, expires=None, path='/',
2                    domain=None, secure=False, httponly=False):

 

key  value是这只cookie.

max_age 和expire区别:max_age是当前写入浏览器cookie的时候,计算过多少秒之后失效。而expire是系统时间多久之后过期。

path='/':该cookie作用域是什么。/表示全局,也就说所有url访问都可以看到该cookie 。

1 def cookie(request):
2     obj=render(request,'cookie.html')
3     obj.set_cookie('k1','v1')
4     return obj
5 def cookie1(request):
6     obj=render(request,'cookie.html')
7     obj.set_cookie('k2','v2')
8     return obj

 

浏览器:

 

如果将path设置专门的url的话,只能访问该url才能看见该cookie。

访问:/cookie1/

访问:/cookie2/

部分网站的登录用cookie来实现:

 1 def log(request):
 2     if request.method=='POST':
 3        u= request.POST.get('user')
 4        p= request.POST.get('pwd')
 5        if u=='evil_liu' and p=='123':
 6            ret=redirect('/index/')
 7            print(dir(ret))#查看ret是否有set_cookie方法
 8            ret.set_cookie('username',u)#设置cookie
 9            return ret
10        else:
11            return render(request,'log.html')
12     else:
13        return render(request,'log.html')
14 def index(request):
15     u=request.COOKIES.get('username')
16     if u:
17         return render(request,'index.html',{'username':u})
18     else:
19         return redirect('/log/')

 

 

这种方式,在浏览器端就可以看到cookie

弊端:将网站的敏感信息都存储在浏览器,这样的话容易被篡改,安全上有 一定问题。

所以现在大多数网站采用session和cookie 来使用。服务器端只发给用户的一段随机字符串,下次客户端来请求携带这个随机字符串,通过这个字符串,服务器端进行判断用户的登录的状态。

二:session 

服务器端只给客户端浏览器的发送随机字符串,客户端下次请求的时候携带这个随机字符串和服务器端session 进行比对验证。

code:

 1 def session_login(request):
 2     if request.method=='POST':
 3         u= request.POST.get('user')
 4         p= request.POST.get('pwd')
 5         if u=='evil' and p=='123':
 6             request.session['username']=u
 7             return redirect('/session_index/')
 8         else:
 9             return  redirect('/session_login/')
10     else:
11         return render(request,'session_login.html')
12 def session_index(request):
13     user=request.session.get('username')
14     if user:
15         return render(request,'session_index.html',{'user':user})
16     else:
17         return redirect('/session_login/')

 

上面代码:第6行的。设置session的时候。服务器端做了如下操作:

1、服务器端产生一个随机字符串

2、将随机字符串发送给客户端的cookie里。下次请求的时候携带这个cookie。

3、django 默认存储session在数据库。所以在调用session的时候需要初始化数据库。

数据库有如下字典:

sessionid      username    expire

随机字符串     evil    2周

注意session默认有效期是2周。

如果后台有很多后台页面,那我们不能每个页面都做如上逻辑判断。可以通过装饰器来灵活处理这个问题

更新后code:

 1 def session_login(request):
 2     if request.method=='POST':
 3         u= request.POST.get('user')
 4         p= request.POST.get('pwd')
 5         if u=='evil' and p=='123':
 6             request.session['username']=u
 7             return redirect('/session_index/')
 8         else:
 9             return  redirect('/session_login/')
10     else:
11         return render(request,'session_login.html')
12 def login_status(func):
13     def inner(request,*args):
14         user=request.session.get('username')
15         if user:
16             return func(request,*args)
17         else:
18             return redirect('/session_login/')
19     return inner
20 @login_status
21 def session_index(request):
22     user=request.session.get('username')
23     return render(request,'session_index.html',{'user':user})

销功能:是将对应的session的中删除掉。

1 @login_status
2 def logout(reuqest):
3     del reuqest.session['username']
4     return redirect('/session_login/')

注销最好这样写:

str=request.session.session_key
request.session.delete(str)

获取随机字符串进行删除。

 1 def del_session(request):
 2     '''
 3     功能:该函数主要功能是注销功能。
 4     :param request: 用户请求信息。
 5     :return: 返回状态值。
 6     '''
 7     if request.method=='POST':
 8         session_key=request.session.session_key
 9         request.session.delete(session_key)
10         return HttpResponse('ok')

 

使用方法:

 1     def index(request):
 2         # 获取、设置、删除Session中数据
 3         request.session['k1']
 4         request.session.get('k1',None)
 5         request.session['k1'] = 123
 6         request.session.setdefault('k1',123) # 存在则不设置
 7         del request.session['k1']
 8  
 9         # 所有 键、值、键值对
10         request.session.keys()
11         request.session.values()
12         request.session.items()
13         request.session.iterkeys()
14         request.session.itervalues()
15         request.session.iteritems()
16  
17  
18         # 用户session的随机字符串
19         request.session.session_key
20  
21         # 将所有Session失效日期小于当前日期的数据删除
22         request.session.clear_expired()
23  
24         # 检查 用户session的随机字符串 在数据库中是否
25         request.session.exists("session_key")
26  
27         # 删除当前用户的所有Session数据
28         request.session.delete("session_key")

 

更多请查看:http://www.cnblogs.com/wupeiqi/articles/5246483.html

 

posted @ 2016-09-15 22:17  evil_liu  阅读(333)  评论(0编辑  收藏  举报