Django 中间件

在Django中就是一个类,在全局范围内改变Django的输入和输出。

  1. 五个方法
  • 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)
    参数 执行的时间 执行的顺序 返回值

    process_request(self,request)

      执行时间:在视图函数执行之前
    
      参数:request   ——》  跟视图函数中的是同一个
    
      执行顺序:按照注册顺序  顺序执行
    
      返回值:None: 正常流程
    
      		HttpResponse对象:不执行后面中间中的process_request方法,不执行视图函数,直接执行当前中间件中的process_response方法,后面正常走
    

    process_response(self, request, response)

      执行时间:在视图函数执行之后
    
      参数:request   ——》  跟视图函数中的是同一个
    
      	    response   ——》  视图函数中传递的响应对象
    
      执行顺序:按照注册顺序  倒叙执行
    
      返回值:HttpResponse对象:必须是响应对象
    

    process_view(self, request, view_func, view_args, view_kwargs)

      执行时间:在process_request方法之后,在视图函数执行之前
    
      参数:request   ——》  跟视图函数中的是同一个
    
      	   view_func ——》 视图函数
    
      	   view_args —— 》视图函数的位置参数
    
      	   view_kwargs——》视图函数的关键字参数
    
      执行顺序:按照注册顺序  顺序执行
    
      返回值:None: 正常流程
    
      		HttpResponse对象:不执行后面中间中的process_view方法,不执行视图函数,直接执行最后一个中间件中的process_response方法,后面正常走
    

    process_exception(self, request, exception)

      执行时间:出现异常的时候才执行
    
      参数:request   ——》  跟视图函数中的是同一个
    
      	   exception——》  异常对象
    
      执行顺序:按照注册顺序  倒叙执行
    
      返回值:None: 正常流程
    
      	HttpResponse对象:不执行后面中间中的process_exception方法,直接执行最后一个中间件中的process_response方法,后面正常走
    

    process_template_response(self,request,response)

      执行时间:视图函数返回的response对象有一个叫render的方法
    
      参数:request   ——》  跟视图函数中的是同一个
    
      	   response   ——》  视图函数中传递的响应对象
    
      执行顺序:按照注册顺序  倒叙执行
    
      返回值:必须返回response对象
    

img
img
img

csrf中间件

csrf 跨站请求伪造

补充两个装饰器:

from django.views.decorators.csrf import csrf_exempt,csrf_protect

csrf_exempt   给视图加上装饰器后,当前的视图不需要CSRF校验

csrf_protect    给视图加上装饰器后,当前的视图需要CSRF校验	
  1. process_request:
    从cookie中获取csrftoken的值 —— 》 request.META['CSRF_COOKIE']

  2. process_view

    1. 视图函数加上csrf_exempt装饰器,不进行CSRF校验

    2. 请求方式 是'GET', 'HEAD', 'OPTIONS', 'TRACE' 也不进行校验

    3. csrf_token = request.META.get('CSRF_COOKIE') # cookie中获取csrftoken的值

      获取提交的csrfmiddlewaretoken的值

      request_csrf_token = request.POST.get('csrfmiddlewaretoken', '')
      如果或许不到csrfmiddlewaretoken的值
      再尝试从请求头中获取X_CSRFTOKEN的值 —— 》request_csrf_token

    4. request_csrf_token 和 csrf_token 进行比较

      1. 能比较成功 通过校验
      2. 不能比较成功 拒绝

定义中间件

  1. 在APP 下创建 middleware 的文件夹
  2. 写一个 py 文件
  3. 定义一个类 继承middlewareMixin 类
    from django.utils.deprecation import MiddlewareMixin
  4. 注册中间件
    app名.middleware.***.py.类名
posted @ 2018-12-27 22:02  拐弯  阅读(120)  评论(0编辑  收藏  举报