Django-cookie
一: 概述
大家都知道HTTP协议是无状态的。
无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不会直接影响后面的请求响应情况。
一句有意思的话来描述就是人生只如初见,对服务器来说,每次的请求都是全新的。
状态可以理解为客户端和服务器在某次会话中产生的数据,那无状态的就以为这些数据不会被保留。会话中产生的数据又是我们需要保存的,也就是说要“保持状态”。因此Cookie就是在这样一个场景下诞生。
Cookie具体指的是一段小信息,它是服务器发送出来存储在浏览器上的一组组键值对,下次访问服务器时浏览器会自动携带这些键值对,以便服务器提取有用信息。
cookie的工作原理是:由服务器产生内容,浏览器收到请求后保存在本地;当浏览器再次访问时,浏览器会自动带上Cookie,这样服务器就能通过Cookie的内容来判断这个是“谁”了。

二: cookie方法
2.1 设置cookie
2.1.1 设置普通的cookie
HttpResponse对象.set_cookie(key=' ',value=' ')
属性
- key, 键
- value='', 值
- max_age=None, 超时时间 7天 7*24*60*60 单位为秒
- expires=None, 超时时间(IE requires expires, so set it if hasn't been already.) 针对IE浏览器
- path='/', Cookie生效的路径,/ 表示根路径,特殊的:根路径的cookie可以被任何url的页面访问
- domain=None, Cookie生效的域名
- secure=False, https传输
- httponly=False 只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖)
2.1.2 设置签名cookie
HttpResponse对象.set_signed_cookie(self, key, value, salt='', **kwargs)
属性
- key cookie的key
- value cookie的value
- salt cookie签名的盐
2.2 获取cookie
2.2.1 获取普通的cookie
request.COOKIES.get('key',默认值)
2.2.2 获取签名的cookie
request.get_signed_cookie(self, key, default=RAISE_ERROR, salt='', max_age=None)
2.3 删除cookie
方式:delete_cookie(self, key, path='/', domain=None)
三: 范例
3.1 普通cookie
def login(request):
if request.method == 'POST':
name = request.POST.get('user')
pwd = request.POST.get('pwd')
if name == 'wangys' and pwd == '123':
ret = redirect('/cs/home/')
ret.set_cookiOe(key='is_login',value=True)
return ret
return render(request,'login.html')
def home(request):
ret = request.COOKIES.get('is_login')
print(ret)
return JsonResponse({'page': 'home'})
3.2 签名cookie
def login(request):
if request.method == 'POST':
name = request.POST.get('user')
pwd = request.POST.get('pwd')
if name == 'wangys' and pwd == '123':
ret = redirect('/cs/home/')
ret.set_signed_cookie('is_access',True,salt='wangys')
return ret
return render(request,'login.html')
def home(request):
ret = request.get_signed_cookie(key='is_access',default=False,salt='wangys')
if ret:
return JsonResponse({'page': 'home'})
else:
redirect('/cs/login')
3.3 登出
def logout(request):
rep = redirect('/cs/login/')
rep.delete_cookie('is_access')
return rep
3.4 装饰器cookie校验
from django.shortcuts import render,redirect
from django.http import JsonResponse,HttpResponse
from functools import wraps
# Create your views here.
def check_login(func):
@wraps(func)
def inner(request,*args,**kwargs):
is_access = request.get_signed_cookie(key='is_access', default=False, salt='wangys')
if is_access:
ret = func(request,*args,**kwargs)
return ret
else:
next_url = request.path_info
return redirect('/cs/login/?next={}'.format(next_url))
return inner
def login(request,*args,**kwargs):
if request.method == 'POST':
name = request.POST.get('user')
pwd = request.POST.get('pwd')
next_url = request.GET.get('next')
print(next_url)
if name == 'wangys' and pwd == '123':
if next_url:
ret = redirect('{}'.format(next_url))
else:
ret = redirect('/cs/home/')
ret.set_signed_cookie('is_access',True,salt='wangys')
return ret
return render(request,'login.html')
@check_login
def home(request):
return render(request,'home.html')
@check_login
def index(request):
return render(request,'index.html')
def logout(request):
rep = redirect('/cs/login/')
rep.delete_cookie('is_access')
return rep

浙公网安备 33010602011771号