cookie:客户端游览器上的一个文件,以键值对进行保存,类似字典{'k':'sfs'},与服务器端没有关系,当游览器访问服务器时候,服务器会
生成一个随机字符串保存在cookie中返回给客户端,这样当客户端游览器下次访问服务器端时候,会带着这个保存了服务器端的随机字符串的
cookie访问服务器,服务器端收到请求后,经过检查此cookie已存在此随机字符串,表示此客户端为已通过认证的状态,可以直接登录。
举例:
通过帐号登录服务器后,服务器端对cookie进行username标识,等客户端下一次访问时候,服务器端先提取cookie的username,如果不为空,表示为已登录帐号
def login(request) u = request.POST.get('name') # 对登录帐号进行验证,如果通过,执行下面 res = redirect('/index') res.set_cookie('username',u) return res 在index的函数直接提取当前登录的帐号是否匹配 def index(request) #提取游览器中的cookie,如果不为空,表示为已登录帐号 v = request.COOKIES.get('username') if not v: return redirect('/login') return render(request,'index.html',{'curr_name':v}
这时,页面使用{{curr_name}}可以直接获取登录帐号名称
游览器查看cookie的方法:这里的cookie可以通过游览器的“审查元素”-> "network" -> "Cookies" 看到
request.COOKIES:包含用户发来的所有数据,这个COOKIES就是一个字典,获取方法有以下2种
获取cookis,获取用户发来请求中的cookies
request.COOKIES['username111']
request.COOKIES.get('username111')
设置cookies,服务器端返回给客户端,并写入cookies
response = render(request,'index.html')
response = redirect('/index/')
# 设置cookie,关闭游览器自动失效
response.set_cookie('key','value')
return response
# 设置cookies超过10秒失效,写法
response.set_cookie('key','value',max_age=10)
# 从登录10秒后失效,写法
current_time = datetime.datetime.utcnow()
current_data = current_time + datetime.timedelta(seconds=10)
response.set_cookie('key','value',expires=current_data)
rep.set_cookie(key,value,...)
rep.set_signed_cookie(key,value,salt='加密盐',...)
参数:
key, 键
value='', 值
max_age=None, 超时时间
expires=None, 超时时间(IE requires expires, so set it if hasn't been already.)
path='/', Cookie生效的路径,/ 表示根路径,特殊的:跟路径的cookie可以被任何url的页面访问
domain=None, Cookie生效的域名
secure=False, https传输
httponly=False 只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖)
cookie 将字符串进行salt加解密,写法如下:
obj = HttpResponse('s')
obj.set_signed_cookie('username','jack',salt='adfadf') # 通过salt进行加密
request.get_signed_cookie('username',salt='adfadf') # 通过原来的salt进行解密
注意:获取cookies写法:request.COOKIES.get('名称') 设置cookies写法:response.set_cookie('key','value')
实例:userlist通过cookie实现页面显示数量
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>分页</title> <style> .page { background:#9acfea; padding: 5px; margin:5px; } .active{ background:red; } </style> </head> <body> <ul> {% for i in li %} {% include 'li.html' %} {% endfor %} </ul> {# {{ page_str|safe }}#} <div style="float: left;"> <select id='ps' onchange="changePageSize(this);"> <option value="10">10</option> <option value="50">50</option> <option value="100">100</option> </select> </div> <div style="float: left;"> {{ page_str }} </div> <script src="/static/jquery-1.12.4.min.js"></script> <script src="/static/jquery-cookie/jquery.cookie.js"></script> <script> /*select选项框修改为当前显示数量*/ $(function () { var v = $.cookie('per_page_count',{'path':"/ug/userlist"}); $('#ps').val(v) }); /*select选项框选择后自动刷新页面*/ function changePageSize(ths) { var v = $(ths).val(); $.cookie('per_page_count',v,{'path':"/ug/userlist"}); location.reload(); } </script> </body> </html>
实例:FBV实现一个帐号登录后,保持10秒,并使用装饰器检查每个URL都为帐号登录状态
def auth(func): ''' 装饰器,检查当前游览器cookies里logname是否存在已登录的帐号,如果存在,则继续执行下面的函数,返回计划进入的url''' def inner(request,*args,**kwargs): v = request.COOKIES.get('logname') if not v: return redirect('/') return func(request,*args,**kwargs) return inner def login(request): '''登录url ''' if request.method == 'GET': return render(request,'login.html') def index(request): if request.method == 'GET': '''get模式,获取cookies的logname帐号名,如果为空则返回登录页面 ''' u = request.COOKIES.get('logname') if not u: return redirect('/') if request.COOKIES['logname'] == 'admin': alluser = models.UserName.objects.exclude(uname='admin') else: # loguser = request.session['username'] loguser = request.COOKIES['logname'] alluser = models.UserName.objects.filter(uname=loguser) return render(request, 'index.html', {'u_list': alluser}) if request.method == 'POST': '''帐号登录验证 ''' logname = request.POST.get('logname',None) logpwd = request.POST.get('logpwd',None) if models.UserName.objects.filter(uname=logname): if models.UserName.objects.filter(uname=logname,upwd=logpwd): # 登录验证成功,重写cookie的登录帐号,延时10秒 response = HttpResponse('ok') response.set_cookie('logname',logname,max_age=10) return response else: return HttpResponse('pwderr') else: return HttpResponse('nmerr') @auth # 装饰器,在访问url为account时候,验证帐号是否为登录状态 def account(request): if request.method == 'GET': return render(request,'account.html') '
实例:CBV通过装饰器实现用户登录认证
from django import views from django.utils.decorators import method_decorator @method_decorator(auth,name='dispatch') class Order(views.View): def get(self,request): v = request.COOKIES.get('logname') return render(request,'index.html',{'current_user':v}) def post(self,request): v = request.COOKIES.get('logname') return render(request,'index.html',{'current_user':v})