Cookie的由来
HTTP协议是无状态的,每次请求都是独立的,对服务器来说,每次的请求都是全新的,上一次的访问是数
据是无法保留到下一次的
某些场景需要状态数据或者中间数据等相关对下一次会话请求有需求的数据, 因此需要一种可以传递的手段
Cookie的本质
Cookie具体为一段小信息,由 服务器 发出存储在 浏览器 上的一组组 键值对
下次访问服务器时浏览器会自动携带这些键值对,以便服务器提取有用信息
Cookie的原理
由服务器产生内容,浏览器收到请求后保存在本地
当浏览器再次访问时,浏览器会自动带上Cookie,这样服务器就能通过Cookie的内容来判断来访者的状态
查看Cookie
谷歌浏览器--右键检查--Network--all--具体项目--cookie
Django中操作Cookie
获取Cookie
request.COOKIES['key'] request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)
参数:
- default : 默认值
- salt : 加密盐
- max_age : 后台控制过期时间 (不设置默认cookie 关闭浏览器就失效)
设置Cookie
rep = HttpResponse(...) rep = render(request, ...) rep.set_cookie(key,value,...) rep.set_signed_cookie(key,value,salt='加密盐', max_age=None, ...)
参数:
- 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
def logout(request): rep = redirect("/login/") rep.delete_cookie("user") # 删除用户浏览器上之前设置的usercookie值 return rep
cookie 示例
1 def check_login(func): 2 @wraps(func) 3 def inner(request, *args, **kwargs): 4 next_url = request.get_full_path() 5 if request.get_signed_cookie("login", salt="SSS", default=None) == "yes": 6 # 已经登录的用户... 7 return func(request, *args, **kwargs) 8 else: 9 # 没有登录的用户,跳转刚到登录页面 10 return redirect("/login/?next={}".format(next_url)) 11 return inner 12 13 14 def login(request): 15 if request.method == "POST": 16 username = request.POST.get("username") 17 passwd = request.POST.get("password") 18 if username == "xxx" and passwd == "dashabi": 19 next_url = request.GET.get("next") 20 if next_url and next_url != "/logout/": 21 response = redirect(next_url) 22 else: 23 response = redirect("/class_list/") 24 response.set_signed_cookie("login", "yes", salt="SSS") 25 return response 26 return render(request, "login.html") 27 28 cookie版登录