zoukankan      html  css  js  c++  java
  • $Django 中间件 csrf

     中间件
      -中间件是什么?请求和响应之间的一道屏障
      -中间件作用:控制请求和响应
      -django中内置几个中间件
       process_request(self,request)
       process_view(self, request, callback, callback_args, callback_kwargs)
       process_template_response(self,request,response)
       process_exception(self, request, exception)
       process_response(self, request, response)
    总的顺序
    我是 request1
    我是 request2
    我是 执行视图函数之前 1
    我是 执行视图函数之前 2
    我是视图函数
    我是 template 2
    我是 template 1
    我是 异常2
    我是 异常1
    我是 response2
    我是 response1

      -自定义中间件
       -1.from django.utils.deprecation import 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 #这里必须返回HTTPRESPONSE对象 对视图函数的返回值response的一个操作,可以丢弃等等操作
       -2.在setting中注册,是有顺序的,
        MIDDLEWARE = [
        'app01.mymiddelware.MyMiddleware1',
        ]
       
      -中间件执行顺序:
       -process_request,从上往下执行
        -如果retrun HttpResponse的对象,直接返回了
        -如果retrun None ,继续往下走
       -process_response,从下往上执行
        -必须要retrun Httpresponse的对象
     csrf:跨站请求伪造 
      比如:转账请求:transfer?to=lqz&count=1000
      -是什么?攻击者盗用了你的身份,以你的名义发送恶意请求,对服务器来说这个请求是完全合法的
      -如何防范:
       -通过refer
       -加一个随机字符串校验(加载请求的路径里,加载请求体中)
       -在请求头中加字符串校验
      django中的应用:
       -中间件csrf不注释掉
       -以后再发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')

      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,说明,所有方法都加了装饰器 
     
    #####py文件
    from django.utils.deprecation import MiddlewareMixin
    from django.utils.decorators import method_decorator
    from django.shortcuts import render,HttpResponse

    class MyMiddleware(MiddlewareMixin):
    def process_request(self,request):
    print('我是 request1')
    # return HttpResponse(1) # 我是 request0 我是 response0
    def process_view(self, request, callback, callback_args, callback_kwargs):
    print ("我是 执行视图函数之前 1")
    #有异常才执行该函数,每异常不管他,必须返回Httpresponse对象(有异常 显示我的信息)
    def process_exception(self, request, exception):
    print ("我是 异常1")
    return HttpResponse('出错了兄弟1')
    # 方法对视图函数返回值有要求,必须是一个含有render方法类的对象,才会执行此方法
    # 1.视图函数 必须返回 一个类(有render方法 返回Httprespons对象)
    # 2.这里要返回一个 Httpresponse对象
    def process_template_response(self,request,response):
    print('我是 template 1')
    return HttpResponse('我是 template1')
    def process_response(self,request,response):
    print('我是 response1')
    return response
    class MyMiddleware1(MiddlewareMixin):
    def process_request(self,request):
    print('我是 request2')
    def process_view(self, request, callback, callback_args, callback_kwargs):
    print ("我是 执行视图函数之前 2")
    def process_exception(self, request, exception):
    print ("我是 异常2")
    def process_template_response(self, request, response):
    print ('我是 template 2')
    return HttpResponse ('我是 template2')
    def process_response(self, request, response):
    print ('我是 response2')
    return response

    ###视图函数
    from django.shortcuts import render,HttpResponse

    # Create your views here.
    class GG():
    def render(self):
    return HttpResponse('template')
    def aaa(request):
    if request.method=='GET':
    print('我是视图函数get')
    return GG()
    elif request.method=='POST':
    print(request.POST,type(request.POST),'我是视图函数post')
    return HttpResponse('ok')


     
     
  • 相关阅读:
    python中深浅复制教程
    jquery easyui打开新的tab实现遮罩效果
    经典逻辑题 百人戴帽子问题
    JAVA反射机制示例 简单的Ioc实现
    Java研修录003标识符
    应该怎么管理程序员?
    内网VSFTP服务器的搭建
    如何彻底关闭WIN10防火墙
    使用 Visual Studio 调试器附加到正在运行的进程
    Qt+VS2019 英文翻译
  • 原文地址:https://www.cnblogs.com/3sss-ss-s/p/10009728.html
Copyright © 2011-2022 走看看