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, 如果不为空, 表示为已登录帐号
- def login(request):
- if request.method=="GET":
- return render(request,'login.html')
- if request.method=="POST":
- u=request.POST.get('username')
- p=request.POST.get('pwd')
- dic=user_info.get(u)
- if not dic:
- return render(request,'login.html')
- if dic['pwd']==p:
- res= redirect('/index/')
- # res.set_cookie(key, value, ...),(键, 值)
- res.set_cookie('username111',u,max_age=10)
- return res
- else:
- return render(request,'login.html')
- def index(request):
- # 获取当前已经登录的用户
- v=request.COOKIES.get('username111')
- if v:
- return render(request,'index.html',{'current_user':v})
- return redirect('/login/')
- Django-cookie
来源: http://www.bubuko.com/infodetail-2649806.html