1、前言
cookie:是保存在客户端浏览器上的一个文件,本质上以键值对的形式保存,类似字典{‘username':'wang'},与服务器没有关系,当浏览器向服务器发送请求时,服务器会自动生成一个随机的字符串保存在cookie中返回给客户端,这样当客户端下次访问时,会带着这个cookie访问服务器,经过检查此cookie已存在此随机字符串,表示此客户端为已通过认证的状态,可以直接登录。
2、参数介绍
2.1、max_age=1:cookie生效的时间,单位是秒
2.2、expire:具体过期时间
2.3、path='/':cookie生效的路径,/表示根路径,特殊的,根路径的cookie可以被任何URL访问
2.4、domain:cookie生效的域名
2.5、secure=False:https传输,与安全相关
2.6、httponly=False:只能只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖)
注意:cookie可以将字符串进行salt加解密,写法如下:
obj = HttpResponse('s')
obj.set_signed_cookie('username',"kangbazi",salt="asdfasdf")
request.get_signed_cookie('username',salt="asdfasdf")
cookie的基本用法
def cookie(request):
request.COOKIES.get('username111')
response=render(request,'index.html')
response=redirect('/index/')
# 设置cookie值,关闭浏览器失效
response.set_cookie('key',"value")
# 设置cookie值,超过N秒后失效
response.set_cookie('username111','value',max_age=10)
# 设置cookie值,从当前时间算起,经过N秒之后失效
import datetime
current_date=datetime.datetime.utcnow()
current_date=current_date+datetime.timedelta(seconds=5)
response.set_cookie('username111','value',expires=current_date)
实例:带有装饰器的cookie
def auth(func): def inner(request,*args,**kwargs): v=request.COOKIES.get('username111') if not v: return redirect('/login/') return func(request,*args,**kwargs) return inner
@auth
def index(request):
# 获取当前已经登录的用户
v=request.COOKIES.get('username111')
return render(request,'index.html',{'current_user':v})
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('username111')
return render(request,'index.html',{'current_user':v})
def post(self,request):
v=request.COOKIES.get('username111')
return render(request,'index.html',{'current_user':v})
举例:通过帐号登录服务器后,服务器端对cookie进行username标识,等客户端下一次访问时候,服务器端先提取cookie的username,如果不为空,表示为已登录帐号
1 def login(request):
2 if request.method=="GET":
3 return render(request,'login.html')
4 if request.method=="POST":
5 u=request.POST.get('username')
6 p=request.POST.get('pwd')
7 dic=user_info.get(u)
8 if not dic:
9 return render(request,'login.html')
10 if dic['pwd']==p:
11 res= redirect('/index/')
12 # res.set_cookie(key, value, ...),(键,值)
13 res.set_cookie('username111',u,max_age=10)
14 return res
15 else:
16 return render(request,'login.html')
17
18 def index(request):
19 # 获取当前已经登录的用户
20 v=request.COOKIES.get('username111')
21 if v:
22 return render(request,'index.html',{'current_user':v})
23 return redirect('/login/')