Cookie-Session
Cookie
cookie就是保存在浏览器本地的一组组键值对
HTTP协议是无状态的,每次请求都是独立的,不受前面的请求响应情况直接影响,也不会影响后面的请求响应,对服务器来书,每次的请求都是全新的
特性:
1.服务器让浏览器进行设置的
2.保存在浏览器本地
3.浏览器下次访问时自动携带响应的cookie
作用:
1.登录校验
2.保存用户的浏览习惯
3.简单的投票
Django操作
# 设置 ret = redirect('/home/') ret.set_cookie('is_login', '1',max_age=5) # 普通的cookie '键','值',超时时间 ret.set_signed_cookie('is_login', '1', max_age=5,'day62') # 加密的cookie 第四个参数加盐 # 获取 request.COOKIES['键'] request.COOKIES.get('键') request.get_signed_cookie('键',salt='盐',default='') # 删除 ret = redirect('/login/') ret.delete_cookie('键')
登录校验
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
from django.shortcuts import render,redirect,HttpResponse from django.views import View # 装饰器 def login_required(func): def inner(request,*args,**kwargs): is_login = request.COOKIES.get('is_login') # 通过字典的键取值 if is_login == '1': ret = func(request,*args,**kwargs) else: return_url = request.path_info ret = redirect('/login/?return_url={}'.format(return_url)) # 将当前访问的地址拼接到login地址后,登录成功后再跳转回来 return ret return inner def login(request): if request.method == 'POST': user = request.POST.get('user') pwd = request.POST.get('pwd') if user == 'alex' and pwd == '123': return_url = request.GET.get('return_url') if return_url: ret = redirect(return_url) else: ret = redirect('/home/') ret.set_cookie('is_login','1') # ret.set_signed_cookie('is_login','1','sss') # 加密 return ret else: return render(request,'login.html', {'err_msg':'用户名或密码错误'}) return render(request,'login.html') @login_required def home(request): return HttpResponse('<h1>home</h1>') @login_required def index(request): return HttpResponse('<h1>index</h1>') def logout(request): ret = redirect('/login/') ret.delete_cookie('is_login') # 通过字典的键删除 return ret
Session
保存在服务器上的一组组键值对,必须依赖于cookie
cookie保存在浏览器本地,不安全,可能被拦截或窃取
cookie本身最大支持4096字节,大小有限制
当浏览器首次访问服务器时,服务器会在自己的数据库文件中记录一组键值对,键是随机生成的,值是浏览器所提交的数据,比如账号密码等,将键返回给浏览器的cookies
保存,这样用户再访问时,通过cookies所携带的唯一id进行验证
django操作
# 获取、设置、删除Session中数据(通过字典的形式进行操作) request.session['k1'] request.session.get('k1',None) request.session['k1'] = 123 request.session.setdefault('k1',123) # 存在则不设置 del request.session['k1'] # 所有 键、值、键值对 request.session.keys() request.session.values() request.session.items() # 会话session的key request.session.session_key # 将所有Session失效日期小于当前日期的数据删除 request.session.clear_expired() # 默认为两周 # 检查会话session的key在数据库中是否存在 request.session.exists("session_key") # 删除当前会话的所有Session数据 request.session.delete() # 删除当前的会话数据并删除会话的Cookie。 request.session.flush() 这用于确保前面的会话数据不可以再次被用户的浏览器访问 例如,django.contrib.auth.logout() 函数中就会调用它。 # 设置会话Session和Cookie的超时时间 request.session.set_expiry(value) * 如果value是个整数,session会在些秒数后失效。 * 如果value是个datatime或timedelta,session就会在这个时间后失效。 * 如果value是0,用户关闭浏览器session就会失效。 * 如果value是None,session会依赖全局session失效策略。
流程解析
登录校验
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# 装饰器 def login_required(func): def inner(request, *args, **kwargs): # 获取session的值 is_login = request.session.get('is_login') if is_login == '1': ret = func(request, *args, **kwargs) else: # 获取要访问的地址 拼接到login地址后 return_url = request.path_info ret = redirect('/login/?return_url={}'.format(return_url)) return ret return inner def login(request): if request.method == 'POST': user = request.POST.get('user') pwd = request.POST.get('pwd') if user == 'alex' and pwd == '123': return_url = request.GET.get('return_url') if return_url: ret = redirect(return_url) else: ret = redirect('/home/') # 设置session request.session['is_login'] = '1' return ret else: return render(request,'login.html', {'err_msg':'用户名或密码错误'}) return render(request,'login.html') @login_required def home(request): return HttpResponse('<h1>home</h1>') @login_required def index(request): return HttpResponse('<h1>index</h1>') def logout(request): request.session.flush() # 删除当前的会话数据并删除会话的Cookie return redirect('/login/')