美文网首页
cbv加装饰器,中间件,csrf

cbv加装饰器,中间件,csrf

作者: aq_wzj | 来源:发表于2018-11-23 15:02 被阅读0次

    1. CBV加装饰器

    - 导入:from django.utils.decorators import method_decorator
    -1 可以在方法上加装饰器:
       @method_decorator(login_auth)
    
    -2 可以在类上加
       @method_decorator(login_auth,name='post')
       @method_decorator(login_auth,name='get')
    
    -3 可以加在dishpatch方法上
       @method_decorator(login_auth)
       一旦加在dishpatch,说明,所有方法都加了装饰器
    

    2. 中间件

    • 中间件是什么?请求和响应之间的一道屏障

    • 中间件作用:控制请求和响应

    • django中内置几个中间件

      在settings.py里面的MIDDLEWARE

    • 自定义中间件

      先导入: from django.utils.deprecation import MiddlewareMixin
      定义一个类,随意命名,继承MiddlewareMixin
      class MyMiddleware1(MiddlewareMixin):
          def process_request(self, request):
              print('MyMiddleware---->1---->process_request')
              # 返回HttpRspons对象,直接返回,走自己的process_response
              # 返回None的时候,继续往下走
              # return HttpResponse('i am middle--1')
              return None
      
          def process_response(self, request, response):
      
              print('MyMiddleware--->1---->process_response')
              return response
      
      然后在setting中注册,是有顺序的
        MIDDLEWARE = [
              'app01.mymiddelware.MyMiddleware1',
              # mymiddelware是自己新建的py文件
          ]
      
    • 中间件的执行顺序

      process_request,从上往下执行
        如果retrun HttpResponse的对象,直接返回,走自己的process_response
          如果retrun None ,继续往下走
      process_response,从下往上执行
        必须要retrun Httpresponse的对象
      
    • 中间件的方法

      process_request
        请求来的时候,会响应它
      process_response
        响应回去的时候,会走它
          
          
      上面两个是重点,以下为了解即可
      process_view(了解)
        参数: request, callback(视图函数), callback_args(无名分组的参数), callback_kwargs(有名分组的参数)
              
      def process_exception(self, request, exception)
      
      def process_template_response(self, request, response)
      
      
    流程图
    1. process_exception是在视图函数出错时才会执行
    2. 如果process_view里面有返回值, 那么会直接跳到process_response上

    3. csrf:跨站请求伪造

    攻击者盗用了你的身份,以你的名义发送恶意请求,对服务器来说这个请求是完全合法的

    csrf攻击图解
    • 如何防范:

      1. 通过refer
      2. 加一个随机字符串校验(加载请求的路径里,加载请求体中)
      3. 在请求头中加字符串校验
    • django中的应用:

      之前我们会在settings里面注释掉'django.middleware.csrf.CsrfViewMiddleware',这行代码

      以后不需要再注释掉了, 以后再发post请求, 携带那个随机字符串

      1. form表单的形式
          <form action="" method="post">
              #<input type='hidden' name='csrfmiddlewaretoken' value='yBwQ6HcM1Bl1jAC75cSoqgVtfriexShbHjtV2TjenYYQVxvv91sVRADi2lkiy9R2' />
              {% csrf_token %}#这一行会被渲染成上面那个东西, 后面的一大串是自动生成的,网页刷新一次就会变掉
      
              <input type="text" name="name">
              <input type="text" name="pwd">
              <input type="submit" value="提交">
          </form>
      2. ajax之放在data提交
        data: {
            'name': $('[name="name"]').val(),
            'pwd': $('[name="pwd"]').val(),
            //'csrfmiddlewaretoken': $('[name="csrfmiddlewaretoken"]').val()
              //上面一行是通过获取那个渲染出来的框得到的字符串
            'csrfmiddlewaretoken': '{{ csrf_token }}'//这个是直接获取到的,这个好,推荐
              //注意需要在{{}}外包引号
            },
      2. ajax之放在headers提交
        $.ajax({
                    url: '',
                    headers: {'X-CSRFToken': token},
                    type: 'post',
                    data: {
                        'name': $('[name="name"]').val(),
                        'password': $("#pwd").val(),
                    },
                    success: function (data) {
                        console.log(data)
                    }
      
                })
      

      也可以使用cookie的方式

      获取cookie:document.cookie
      
      是一个字符串,可以自己用js切割,也可以用jquery的插件
      
      获取cookie:$.cookie('csrftoken')
      
      设置cookie:$.cookie('key','value')
      

    4. csrf的局部禁用,局部使用

    首先, 局部禁用的前提是全局开启了, 即settings里并没有注掉

    局部使用的前提是全局禁用了, 即settings里注掉了

    • 首先需要导入装饰器

      from django.views.decorators.csrf import csrf_exempt,csrf_protect
      
    • 基于FBV-->直接加载fbv上就行了

      -局部禁用,全局得使用
          @csrf_exempt
          def csrf_disable(request):
              print(request.POST)
              return HttpResponse('ok')
      -局部使用,全局得禁用
          @csrf_protect
          def csrf_disable(request):
              print(request.POST)
              return HttpResponse('ok')
      
    • 基于CBV-->只能加在dispatch方法或者类上面

      from django.views import View
      from django.utils.decorators import method_decorator
      @method_decorator(csrf_protect,name='dispatch')
      class Csrf_disable(View):
          # @method_decorator(csrf_protect)
          def dispatch(self, request, *args, **kwargs):
              ret=super().dispatch(request, *args, **kwargs)
              return ret
          def get(self,request):
              return HttpResponse('ok')
      
          def post(self,request):
              return HttpResponse('post---ok')
      

    [图片上传中...(1350514-20180820125344585-649037160.png-d38573-1542956602760-0)]

    相关文章

      网友评论

          本文标题:cbv加装饰器,中间件,csrf

          本文链接:https://www.haomeiwen.com/subject/vhujqqtx.html