Django 之中间件

一.django的中间件

    1.一个python类    用于全局范围内   处理请求 和响应的 勾子  谨慎使用

    2. 自定义  middleware.py 中可以写多个类---->多个中间件         在setting中注册 开启

    3.执行顺序:  浏览器-->wsgi(封装request,response对象) process_request   --->  process_view-->  view--->  process_response

      ---->wsgi--->浏览器 

1.process_request(request)   根据注册顺序执行

 如果 一个类的process_request  有返回httpresponse 对象   注册顺序在这个类之前的还会执行process_request,process_response

  在这个类之后注册 的 request 和response 中间件和view 都不会执行了 (注册循序在下面的)

2.process_response(request,response)  根据注册顺序 反序 执行

       必须返回一个response 对象

3.process_view(view_func   view_args  view_kwargs)    根据注册顺序执行

    在process_request, 匹配路由 之后, 在view之前执行    返回值None就正常走   

     返回resposne时  它之后的  process_view view 不执行                          执行所有process_resposne

 4.process_exception(request,exception)   根据注册顺序 反序 执行

     有异常时执行    在view之后,在process_response之 

     返回值:  如果 是httpresponse    将执行 在他注册顺序 之后 的中间件的 process_response 函数(与process_request一样)

          不执行在它之后的 process_exception不执行

  5. process_template_response()

         在resposne 有render方法时   执行  不是函数的render      返回值: resposne对象

           ret=HttpResposne('ok')   ret.render=xx  xx是一个返回response的函数

6.总结 

   1.在view左边的都是注册顺序执行,在view 右侧的 都是 注册反序执行

 当process_request 返回 response时,执行他自己的process_resposne,          当process_view返回resposne时执行所有resposne

    

process_exception 触发条件,贯穿整个右侧  执行process_exception 之后的process_resposne中间件

7.整个流程图

requet.META.get('REMOTE_ADDR')   获得访问ip地址

二. csrf_token 工作流程 

 1. CSRF中间件  
        CSRF跨站请求伪造        当html网页中   放上 {%csrf_token%} 时 浏览器 的cookie就会添加一个这样的cookie
  2. csrf_token校验方式
       1. process_request 中的 cookie中:
            从请求的cookie中获取csrftoken的值   ——》csrf_token   ——》request.META['CSRF_COOKIE']

        2.process_views 中:

                 request.META.get('CSRF_COOKIE') —— 》 csrf_token 
                 request_csrf_token = "" 
   3.csrf_token获取方式
       1. 从request.POST中获取csrfmiddlewaretoken对应的值
              request_csrf_token = request.POST.get('csrfmiddlewaretoken', '')
       2. 从请求头中获取X-csrftoken 的值 
              request_csrf_token = request.META.get(settings.CSRF_HEADER_NAME, '')
             request_csrf_token 和 csrf_token 做对比  
        如果校验成功 正常走
        如果校验不成功 拒绝 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值