目录
@
Cookie介绍
Cookie的由来
大家都知道==HTTP协议是无状态的==.
==无状态的的意思是每次请求都是独立的==,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不会直接影响后面的请求响应情况.
人生只如初见,对于服务器来说,每次的请求都是全新的.
==状态可以理解为客户端和服务器在某次会话中产生的数据.==
==无状态就可以理解为这些数据不会被保留==. 会话中产生的数据又是我们需要保存的,也就是说要"保持状态",因此Cookie就在这样一个场景下诞生了. ***什么是Cookie
Cookie具体指的是一段小信息,==它是服务器发送出来存储在浏览器上的一组组键值对==。下次访问服务器时浏览器会自动携带这些键值对,以便服务器提取有用的信息.
Cookie本身最大支持4096字节. ***Cookie的原理
有服务器产生内容,浏览器收到请求后保存在本地;当浏览器再次访问时,浏览器会自动带上Cookie,这样服务器就能通过Cookie的内容来判断这个是"谁"了.
***查看Cookie
我们使用Chrome浏览器,打开开发者工具:
操作Cookie
获取Cookie
def login(request): # 获取Cookie: ret = request.COOKIES['user'] # ret = request.COOKIES.get('user') # request.get_signed_cookie(key, salt='user', default='') # request.get_signed_cookie('user', default=RAISE_ERROR, salt='', ax_age=None) return render(request, 'login.html')
get_signed_cookie方法的参数:
- default:默认值
- salt:加密盐
- max_age:后台控制过期时间 ***
设置 Cookie
def test(request): rep = HttpResponse('is ok') # 设置Cookie: rep.set_cookie('user', 'zyk') # rep.set_signed_cookie('user', 'zyk', salt="加盐") return rep
查看设置的Cookie,如图:
set_cookie方法的参数:
- key:键.
- value='':值.
- max_age=None:超时时间.
- expires=None:指定IE浏览器超时时间(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
def test(request): rep = HttpResponse('is ok') # 删除Cookie: rep.delete_cookie('user') return rep
Cookie版登陆校验:
from django.shortcuts import render, redirect, HttpResponsefrom blog01 import models# 装饰器函数def login_required(fn): """如果未登陆,将返回login页面""" def inner(request, *args, **kwargs): print(request.COOKIES.get('is_login')) if request.COOKIES.get('is_login') != '1': # 获取当前url路径 next = request.path_info return redirect('/login/?next=%s' % next) ret = fn(request, *args, **kwargs) return ret return inner# 登陆功能def login(request): if request.method == 'POST': user = request.POST.get('user') pwd = request.POST.get('pwd') if models.Userinfo.objects.get(name=user, pwd=pwd): # 提取跳转之间访问的页面 next = request.GET.get('next') rep = redirect(next) if next else redirect('/home/') # 设置Cookie, max_age=1:指定过期时间为1秒 rep.set_cookie('is_login', '1', max_age=1) return rep return render(request, 'login.html')@login_requireddef home(request): return HttpResponse("我是home页面")@login_requireddef home01(request): return HttpResponse("我是home01页面")