• django框架之自定义中间件及csrf跨站请求伪造等相关内容-75


    今日内容

    1 django的session原理流程

    2 自定义中间件

    1 自定义步骤:
    -写一个类,继承MiddlewareMixin
       -里面写方法process_request(请求来了,一定会触发它的执行)
       -在setting中配置(注意,放在前和放在后)
      MIDDLEWARE = [
              ...
      'app01.mymiddle.MyMiddleware1',
              ...
    ]

     

    3 process_request,process_response,process_view,process_exception

    1 process_request(request对象)
    2 process_response(request对象,response对象)
    3 多个中间件,执行顺序是什么?
    -请求来的时候从上往下执行:process_request
       -请求走的时候,从下往上执行:process_response
           
           
    4 process_request可以干什么?
    -写一个中间件,不管前端用什么编码,在requset.data中都有post的数据
       -频率限制(限制某个ip地址,一分钟只能访问5次)
       -登录认证(只要没登录,重定向到login路径)、
       -记录用户访问日志(ip,时间,访问路径)
       
    5 process_response可以干什么?内部有response对象
    -统一给所有(某几个路径)加cookie
       -统一给所有(某几个路径)加响应头
       
       
       
    6 process_view 路由匹配成功和视图函数执行之前执行(callback就是视图函数)
       def process_view(self, request, callback, callback_args, callback_kwargs):
               # print(callback)
               # print(callback_args)
               # print(callback_kwargs)
               #
               res=callback(request)
               #
               print("中间件1的process_view")
               return res
    7 process_exception 视图函数出错,会执行它(全局异常捕获)(记录日志,哪个ip地址,访问哪个路径,出的错)
       # 全局异常捕获,返回4开头的
       def process_exception(self, request, exception):
           print(exception)
           return render(request,'error.html')

     

    4 CSRF_TOKEN跨站请求伪造

    1 跨站请求伪造
    2 代码演示


    3 django解决了csrf攻击,中间件:django.middleware.csrf.CsrfViewMiddleware


    4 后期中间件不能注释,每次发送post请求,都需要携带csrf_token随机字符串
    -form表单提交
      -在form表单中 {% csrf_token%}
           
       -ajax提交(如何携带)
       方式一:放到data中
        $.ajax({
               url: '/csrf_test/',
               method: 'post',
               data: {'name': $('[name="name"]').val(),
                   'password': $('[name="password"]').val(),
                   'csrfmiddlewaretoken':$('[name="csrfmiddlewaretoken"]').val()
              },
               success: function (data) {
                   console.log('成功了')
                   console.log(data)

              },
               error: function (data) {
                   console.log('xxxxx')
                   console.log(data)

              }
          })
           方式二:放到data中
           'csrfmiddlewaretoken':'{{ csrf_token }}'
           方式三:放到头中
          headers:{'X-CSRFToken':'{{csrf_token}}'},
           
           
    # jquery.cookie.js
    -在浏览器中对cookie进行增,删,查,改
       -前后端分离(js操作cookie)
       
       
       
    # 全局使用,局部禁csrf
    -在视图函数上加装饰器
       from django.views.decorators.csrf import csrf_exempt,csrf_protect
    # 全局启用,局部禁用(中间件不能注释,这个视图函数,已经没有csrf校验了)
    # @csrf_exempt
    # def csrf_test(request):
    #     if request.method=='GET':
    #         return render(request,'csrf_test.html')
    #     else:
    #         name=request.POST.get('name')
    #         password=request.POST.get('password')
    #         print(name)
    #         print(password)
    #         return HttpResponse('登录成功')

    # 全局禁用,局部使用csrf
    @csrf_protect
    def csrf_test(request):
       if request.method=='GET':
           return render(request,'csrf_test.html')
       else:
           name=request.POST.get('name')
           password=request.POST.get('password')
           print(name)
           print(password)
           return HttpResponse('登录成功')



    # 古怪的使用方式,在urls.py中
    path('csrf_test/', csrf_exempt(views.csrf_test))
  • 相关阅读:
    logging模板日志格式
    MariaDB修改默认字符集
    Django之表单验证
    Django之定制属于自己的admin
    sympy-高数可以这么学
    matplotlib01
    mysql---- 用户权限管理
    django----JSONP知识回顾
    django----文件上传
    数据库结构备份
  • 原文地址:https://www.cnblogs.com/usherwang/p/14169457.html
Copyright © 2020-2023  润新知