cookie与session简介及操作
为什么会有这些技术
1.目的是为了保存客户端的用户状态
2.原因:HTTP协议是无状态的
cookie
cookie:保存在客户端浏览器上的键值对
cookie虽然是保存在客户端浏览器上的键值对,但它是由服务端设置的,浏览器有权禁止cookie的写入
django如何操作cookie
小白必会三板斧
利用obj对象才可以操作cookie
obj=HttpResponse() obj=render() obj=redirect() return obj
设置cookie
obj.set_cookie('k1','v1')#告诉浏览器设置cookie
获取cookie
request.COOKIES.get('k1')#获取浏览器携带过来的cookie值
设置cookie的超时时间
两个参数都是设置时间,并且都是以秒为单位
区别:如果想要给IE浏览器设置cookie的超时时间,只能用expires
obj.set_cookie('k1','v1',max_age=3) obj.set_cookie('k1','v1',expires=3)
删除cookie
(注销 退出登录) obj.delete_cookie('k1')
def login(request): if request.method=='POST': username=request.POST.get('username') password=request.POST.get('password') if username=='jason' and password=='123': old_path=request.GET.get('next') if old_path:#防止用户直接访问login页面 obj=redirect(old_path) else: obj=redirect('/home/')#默认跳转到首页 # obj.set_cookie('whoami','jason',max_age=10)#告诉浏览器保存一个键值对,max_age=10:十秒后失效 obj.set_cookie('whoami','jason')#告诉浏览器保存一个键值对,max_age=10:十秒后失效 return obj return render(request,'login.html') #装饰器 from functools import wraps def login_auth(func): @wraps(func) def inner(request,*args,**kwargs): #判断当前用户是否登录 print(request.path_info)#只获取url print(request.get_full_path())#获取url+get参数 if request.COOKIES.get('whoami'): res=func(request,*args,**kwargs) return res else: target_path=request.path_info return redirect('/login/?next=%s'%target_path) return inner @login_auth def home(request): #校验用户是否登录 # if request.COOKIES.get('whoami'): return HttpResponse('home页面 只有登录的人才可以访问') @login_auth def index(request): return HttpResponse('index页面 只有登录的人才可以访问') @login_auth def logout(request): obj=redirect('/login/') obj.delete_cookie('whoami') return obj
session
session:保存在服务端上的键值对
session的工作机制是依赖于cookie的
设置session
django session在创建数据的时候,是针对浏览器的
request.session['k1']='v1'
第一次设置的时候会报错 :没有执行数据库迁移命令,生成django需要用到的一些默认表(django_session)
django的默认session失效时间是14天
request.session['k1']='v1'做了那些事:
1.django内部自动调用算法生成一个随机的字符串(数据也是加密处理)
2.在django_session添加数据
随机字符串 加密之后的数据 失效时间
dnsfj ksdfjksjfksjfdjf
3.将产生的随机字符串返回给客户端浏览器,让浏览器保存
sessionid:随机字符串
获取session
request.session.get('k1')
1.django内部会自动去请求头里面获取cookie
2.拿着sessionid所对应的随机字符串去django_session表中一一比对
3.比对上了就会将随机字符串对应的数据获取出来,自动放在request.session中共程序员调用。如果没有比对上就是一个空字典
删除session
request.session.delete()#客户端和服务端全部删除,只会根据浏览器的不同删除对应的数据 request.session.flush()
设置session失效时间
request.session.set_expriy(5) request.session.set_expriy(value) 如果value是一个整数,session会在value秒数之后失效 如果value是一个datatime或timedelta,session就会在这个时间后失效 如果value是0,用户关闭浏览器session就会失效 如果value是None,session会依赖全局session失效策略
def set_session(request):#设置session request.session['k1']='jason666' request.session.set_expiry(10)#设置失效时间 # request.session['k2']='json666' # request.session['k']='jasn666' return HttpResponse('设置成功') def get_session(request):#获取session if request.session.get('k1'): # res=request.session.get('k1') # res=request.session.get('k2') # res=request.session.get('k3') return HttpResponse('获取成功') return HttpResponse('失效了') def delete_session(request):#删除session request.session.delete()#客户端 服务端全部删除 # request.sesion.flush()#建议使用这个 return HttpResponse('删除了')
session补充
能够作为数据库的:数据库软件(关系型,非关系型)、文件、内存
token:加密字符串
django中间件
django默认有七个中间件:
只要你想要做一些网站的全局性功能,你都应该考虑使用django的中间件
1.全局的用户登录校验
2.全局的用户访问频率校验
3.全局的用户权限校验
django的中间件是所以框架里面的做的最完善的
对象 字符串》》》》反射
全局》》》》》》》》中间件
django默认七个中间件,并且支持用户自定义中间件,然后暴露给用户五个可以自定义的方法
需要掌握:
process_request
1.请求来的时候会按照settings配置文件从上往下的顺序,依次执行每一个中间件内部定义的process_request方法,如果中间件内部没有该方法,直接跳过执行下一个中间件
2.该方法一旦返回了HttpResponse对象,那么请求会立刻停止往后走,原路立即返回
process_response
1.响应走的时候会按照settings配置文件从下往上的顺序,依次执行每一个中间件内部定义的process_response方法。
2.该方法必须有两个形参,并且必须返回response形参,不返回直接报错
3.该方法返回什么(httpResponsed对象),前端就能获取什么
当process_request方法直接返回httpResponsed对象之后,会直接从当前中间件里面的process_response往回走,没有执行的中间件都不会再执行
需要了解:
process_view
process_view(self,request,view_name,*args,**kwargs)
1.路由匹配成功之后执行视图函数之前触发
2.如果该方法返回了HttpResponse对象,那么会从下往上经过每一个中间件里面的process_response方法
process_template_response
1.当你返回的对象中含有render属性指向一个render方法的时候才会触发,从下往上的顺序
process_exception
1.当视图函数中出现错误,会自动触发,顺序是从下往上
以上五个方法,会在特定的阶段自动触发(如果形参中含有response,那么必须要返回)
from django.utils.deprecation import MiddlewareMixin from django.shortcuts import HttpResponse,redirect,render class MyMdd1(MiddlewareMixin): def process_request(self,request): print('我是第一个中间件里面的process_request方法') # return HttpResponse('我是中间件一里面的') def process_response(self,request,response): print('我是第一个中间件里面的process_response方法') return response # return HttpResponse('我是中间件一里面的') def process_view(self,request,view_name,*args,**kwargs): # print(view_name) # print(args) # print(kwargs) print('我是第一个中间件里面的process_view方法') # return HttpResponse('我是中间件一里面的process_view') def process_exception(self,request,exception): print('我是第一个中间件里面的process_exception方法') print(exception) def process_template_response(self,request,response): print('我是第一个中间件里面的奇葩方法') return response class MyMdd2(MiddlewareMixin): def process_request(self,request): print('我是第二个中间件里面的process_request方法') # return HttpResponse('我是中间件二里面的') def process_response(self,request,response): print('我是第二个中间件里面的process_response方法') return response # return HttpResponse('我是中间件二里面的') def process_view(self,request,view_name,*args,**kwargs): # print(view_name) # print(args) # print(kwargs) print('我是第二个中间件里面的process_view方法') # return HttpResponse('我是中间件二里面的process_view') def process_exception(self,request,exception): print('我是第二个中间件里面的process_exception方法') print(exception) def process_template_response(self,request,response): print('我是第二个中间件里面的奇葩方法') return response