Django之中间件详情

今日内容概要

  • 1 > django操作cookie补充
  • 2 > django操作session
    • 2.1 > 设置session内部发生的事情
    • 2.2 > 获取session内部发送的事情
    • 2.3 > django操作session补充
  • 3 > CBV添加装饰器
  • 4 > django中间件
    • 4.1 > 自定义中间件
  • 5 > csrf跨站请求伪造
    • 5.1 > csrf解决策略

1 > django操作cookie补充

   设置加密操做


	set_signed_cookie(key,value,salt='加密盐')

   超时时间操做


	set_signed_cookie(key,value,max_age=超时时间:默认是秒数)

   专门针对IE浏览器设置超时时间


	expires:

   删除cookie操做


	HttpResponse对象.delete_cookie(key) 
	

2 > django操作session

   session基本操做(设置,获取):


	# 设置
	request.session['key'] = value  # 可以设置多组
	
	# 获取
	request.session.get('key')  # 可以获取多组

   我们研究session的使用机制发现


	他是一个由服务端保存用户相关状态信息 返回给客户端随机字符的这么一个操做
	针对保存 django需要一张表来处理 >>> 自带的django_session表
	ps:django数据库迁移命令会产生一堆默认的表 其中就有一张django_session表
	

Django之中间件详情_第1张图片

2.1 > 设置session内部发生的事情


	1.产生一个随机字符串
	2.表中存储随机字符串与加密数据的对应关系 
	3.并将产生的随机字符串也给客户端发送一份并让其保存
		sessionid:随机字符串
	

2.2 > 获取session内部发送的事情


	1.自动获取客户端请求中的随机字符串
	2.自动去存储session数据的表中比对
	3.如果比对成功自动获取并'解密处理'
		# django默认的session失效时间是14天

2.3 > django操作session补充

	
	request.session.session_key  			# 获取产生的随机字符串
	request.session.delete()  				# 只删客户端
	request.session.flush()  				# 服务端 客户端都删
	request.session.set_expiry(value)  		# 设置超时时间
		* 如果value是个整数,session会在些秒数后失效。
	    * 如果value是个datatime或timedelta,session就会在这个时间后失效。
	    * 如果value是0,用户关闭浏览器session就会失效。
	    * 如果value是None,session会依赖全局session失效策略。


	针对session数据的存储位置 有五种方案
		1.数据库存储
		2.缓存存储
		3.文件存储
		4.缓存+数据库存储
		5.动态加密
		

3 > CBV添加装饰器

   需要借助于一个专门的装饰器模块


	from django.utils.decorators import method_decorator

   方式1:直接在类中的某个方法上添加


	from django.utils.decorators import method_decorator
		class MyLoginView(views.View):
		    @method_decorator(login_auth)
		    def get(self, request):
		        return HttpResponse("from CBV get view")
		        

   方式2:直接在类名上添加并指定


	from django.utils.decorators import method_decorator
	@method_decorator(login_auth, name='get')
	class MyLoginView(views.View):
	    def get(self, request):
	        return HttpResponse("from CBV get view")

   方式3:重写dispatch方法并添加作用于类中所有的方法


	from django.utils.decorators import method_decorator
		class MyLoginView(views.View):
		    @method_decorator(login_auth)
		    def dispatch(self, request, *args, **kwargs):
		        super().dispatch(request,*args,**kwargs)

4 > django中间件

   我们根据回忆django的请求生命周期流程图知道,django中间件是django的门户。
   django中自带七个中间件 每个都有各自对应的功能。
Django之中间件详情_第2张图片
   django不单有七个中间件并且每个都有很多功能和方法
   除此之外django还支持自定义中间件并提供五个可以自定义的方法


	process_request
	process_response
	process_view
	process_template_response
	process_excepton

   django中间件的使用场景: 只要是全局相关的功能都可以在中间件中编写。


	eg:用户黑名单校验、
		用户访问频率校验、
		网站全局用户身份校验

4.1 > 自定义中间件

   自定义的基本流程如下:


	1.创建一个任意名称的文件夹
	2.在该文件夹内创建一个任意名称的py文件
	3.在该py文件内编写中间件类
	4.配置文件中注册

Django之中间件详情_第3张图片
Django之中间件详情_第4张图片

   必须要掌握的方法。
   1 > process_request


	请求来的时候会从上往下依次执行配置文件中注册了的中间件里面的process_request方法 如果没有则直接跳过
	如果该方法自己返回了HttpResponse对象,那么请求不再继续往后直接返回相应的数据

Django之中间件详情_第5张图片
   2 > process_response


	响应走的时候会从下往上依次执行配置文件中注册了的中间件里面的
	process_response方法 如果没有则直接跳过

	如果该方法自己返回了HttpResponse对象,
	那么响应会替换成该HttpResponse对象数据 
	而不再是视图函数想要返回给客户端的数据

"""如果process_request返回了HttpResponse对象 那么会从当前位置从下往上执行每一个process_response"""

Django之中间件详情_第6张图片

Django之中间件详情_第7张图片
   需要了解的方法


	1.process_view
		路由匹配成功之后执行视图之前从上往下执行配置文件中注册了的中间件里面的process_view方法
		
	2.process_template_response
		视图函数执行完毕之后返回的对象中含有render属性对应一个render方法
		则会从下往上执行配置文件中注册了的中间件里面的process_template_response方法
		
	3.process_exception
		视图函数执行过程中报错并在返回响应的时候会从下往上执行配置文件中注册了的中间件里面的process_exception

5 > csrf跨站请求伪造


# 前戏
	钓鱼网站:一个模仿正规网站的网址 诱骗用户在该网站上做本应该在正规网站上做的操作,从而获取到该用户在正规网站上的数据甚至是财产
  eg:假设我们需要登录网页完成转账操作
    我们不小心登录到了钓鱼网站 填写了账户 密码 对方账户等信息
    点击转账之后我们账户的钱确实减少了 但是对方账户却变成了一个你从来不认识的人
  原理:将收款人的账号 提前写成犯罪分子的然后隐藏 暴露给用户一个没有name属性的标签写着玩

5.1 > csrf解决策略


	"""针对csrf相关的校验有很多种方式 django只是提供了一些而已"""
	
	# form表单
		<form action="" method="post">
	    {% csrf_token %}
	    <p>当前账户:<input type="text" name="current_user"></p>
	    <p>目标账户:<input type="text" name="target_user"></p>
	    <p>转账金额:<input type="text" name="money"></p>
	    <input type="submit">
		</form>
	# ajax请求
		1.方式1:页面任意位置先写{% csrf_token %} 之后获取数据     'csrfmiddlewaretoken':$('input[name="csrfmiddlewaretoken"]').val()
	  2.方式2:模板语法直接获取
	    'csrfmiddlewaretoken':{{ csrf_token }}
	
	"""通用解决方案:js脚本自动处理"""
		也只能适用于ajax提交  form表单还是需要额外指定


你可能感兴趣的:(django,中间件,python)