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