cookie 与session原理
目的:
保护客户端的用户状态
原因:
HTTP协议是无状态的
cookie
保存在客户端浏览器上的键值对
cookie虽然是保存在客户端浏览器上的键值对,但它是由服务端设置,浏览器有权进制cookie的写入
django如何操作cookie
需要利用obj对象才可以操作cookie
obj = HttpResponse()
return obj
obj = render()
return obj
obj = redirect()
return obj
设置cookie
obj.set_cookie('k1','v1')
告诉浏览器位置
获取cookie
request.COOKIES.get('k1')
获取浏览器携带过来的cookie值
设置cookie的超时时间
obj.set_cookie('k1','v1',max_age=3)
obj.set_cookie('k1','v1',expires=3)
#两个参数都是设置超时时间,都是以秒做单位
#区别是如果是给IE浏览器设置,只能用expires
session
保存在服务端上的键值对
session的工作机制是需要依赖于cookie的
设置session
request.session['k1']='v1'
注意:第一次设置需要执行数据库迁移命令,生成django需要用到的一些默认表(django_session)
设置session发生的事
-
django内部自动调用算法生成一个随机的字符串
-
在django_session添加数据(数据已被加密处理)
-
将产生的随机字符串返回给客户端浏览器,让浏览器保存
sessionid:随机字符串
获取session
request.session.get('k1')
获取session发生的事
- django内部自动去请求头里获取cookie
- 用sessionid所对应的的随机字符串去django_session表中一一对比
- 如果对比成功,会将随机字符串自动放入request.session中,没有就是一个空字典
删除session
request.session.delete()
根据浏览器的不同删除对应的客户端和服务端数据
设置失效时间
设置会话session和cookie的超时时间
request.session.set_expiry(value)
- 如果value是整数,session会在value秒后失效
- 如果value是datatime或者timedelta,session会在这个时间后失效。
- 如果value是0,用户关闭浏览器就会失效
- 如果value是None,session会依赖全局session失效策略
能够作为数据库
- 数据库软件
- 文件
- 内存
token
加密字符串
Django中间件
在视图函数执行之前和执行之后都可以做一些额外的操作,它本质上就是一个自定义类,类中定义了几个方法,Django框架会在请求的特定的时间去执行这些方法。
django默认中间件有七个
中间件的用处
- 全局的用户登录校验
- 全局的用户访问频率校验
- 全聚德用户权限校验
django支持用户自定义中间件
中间件可以定义的五个方法
- process_request(self,request)
- process_view(self, request, view_func, view_args, view_kwargs)
- process_template_response(self,request,response)
- process_exception(self, request, exception)
- process_response(self, request, response)
以上方法的返回值可以是None或一个HttpResponse对象,如果是None,则继续按照django定义的规则向后继续执行,如果是HttpResponse对象,则直接将该对象返回给用户。
process_request
- 请求来的时候会按照settings配置文件中从上往下的顺序 依次执行每一个中间件内部定义的process_request方法,如果中间件内部没有该方法 直接跳过执行下一个中间件
- 该方法一旦返回了HttpResponse对象,那么请求会立刻停止往后走 原路立即返回
process_response
- 响应走的时候会按照settings配置文件中从下往上的顺序 依次执行每一个中间件内部定义的process_response方法,
- 该方法必须有两个形参 并且必须返回response形参 不返回直接报错
- 该方法返回什么(HttpResponsed对象) 前端就能获得什么
当process_request方法直接返回HttpResponse对象之后 会直接从当前中间件里面的process_respone往回走
没有执行的中间件都不会再执行
process_view(self,reqeust,view_name,*args,**kwargs)
- 路由匹配成功之后执行视图函数之前触发
- 如果该方法返回了HttpResponse对象 那么会从下往上一次经过每一个中间件里面的process_response方法
process_template_response
当返回的对象中含有render属性指向的是一个render方法的时候才会触发 从下往上的顺序
def xxxx(request):
print('asgasda')
def render():
return HttpResponse('xxxx')
obj = HttpResponse('aaaa')
obj.render = render
return obj
process_exception
当视图函数中出现错误 会自动触发 顺序是从下往上