12.04

cookie 与session原理

目的:

保护客户端的用户状态

原因:

HTTP协议是无状态的

保存在客户端浏览器上的键值对

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发生的事

  1. django内部自动调用算法生成一个随机的字符串

  2. 在django_session添加数据(数据已被加密处理)

  3. 将产生的随机字符串返回给客户端浏览器,让浏览器保存

    sessionid:随机字符串

获取session

request.session.get('k1')

获取session发生的事

  1. django内部自动去请求头里获取cookie
  2. 用sessionid所对应的的随机字符串去django_session表中一一对比
  3. 如果对比成功,会将随机字符串自动放入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默认中间件有七个

中间件的用处

  1. 全局的用户登录校验
  2. 全局的用户访问频率校验
  3. 全聚德用户权限校验

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

  1. 请求来的时候会按照settings配置文件中从上往下的顺序 依次执行每一个中间件内部定义的process_request方法,如果中间件内部没有该方法 直接跳过执行下一个中间件
  2. 该方法一旦返回了HttpResponse对象,那么请求会立刻停止往后走 原路立即返回

process_response

  1. 响应走的时候会按照settings配置文件中从下往上的顺序 依次执行每一个中间件内部定义的process_response方法,
  2. 该方法必须有两个形参 并且必须返回response形参 不返回直接报错
  3. 该方法返回什么(HttpResponsed对象) 前端就能获得什么

当process_request方法直接返回HttpResponse对象之后 会直接从当前中间件里面的process_respone往回走
没有执行的中间件都不会再执行

process_view(self,reqeust,view_name,*args,**kwargs)

  1. 路由匹配成功之后执行视图函数之前触发
  2. 如果该方法返回了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

当视图函数中出现错误 会自动触发 顺序是从下往上

posted @ 2019-12-04 19:55  mqb11  阅读(127)  评论(0编辑  收藏  举报