中间件

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,说明,所有方法都加了装饰器

中间件

  -中间件: 请求和响应之间的一道屏障

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

  -django中内置几个中间件

  -自定义中间件

    

-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',
                ]

中间执行顺序:

  -process_request,从上往下执行

     -如果retrun HttpResponse的对象,直接返回了

     -如果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):(了解)

csrf:跨站请求伪造

   比如:转账请求:transfer?to=lqz&count=1000

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

   -如何防范:

     -通过refer

     -加一个随机字符串校验(加载请求的路径里,加载请求体中)

     -在请求头中加字符串校验

django中的应用:
            -中间件不注释掉
            -以后再发post请求,携带那个随机字符串
                -form表单形式:
                    <form action="" method="post">
                        {% csrf_token %}
                        <input type="text" name="name">
                        <input type="text" name="pwd">
                        <input type="submit" value="提交">
                    </form>
                -ajax提交
                data: {
                    'name': $('[name="name"]').val(),
                    'pwd': $('[name="pwd"]').val(),
                    //'csrfmiddlewaretoken': $('[name="csrfmiddlewaretoken"]').val()
                    'csrfmiddlewaretoken': '{{ csrf_token }}'
                    },
        csrf:局部禁用,局部使用
            -用装饰器: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')

  

原文地址:https://www.cnblogs.com/zhouhao123/p/10008117.html