• 中间件


    中间件

    如果涉及到全局的功能 就应该考虑使用中间件

    关于中间件 django.middleware.csrf.CsrfViewMiddleware

    这个中间件是解决跨站伪类请求而设置的
    在前端随机生成一个设置好的随机字符串,提交到我们的数据提交接口的时候就校验,有就提交,没有就403

    跨扎伪类请求

    跨扎伪类请求,其实就是一个钓鱼网站

    原理

    1. 搭建一个和转账网站一模一样的网站
    2. form表单中action提交的地址提交到正规网站一样的地址
    3. 设置一个暴露给用户的收款人的提交框
    4. 提前隐藏一个收款人的提交框,默认是自己的账户,就是有name和value的input框
    5. 用户一旦输入,只有用户名和密码是有效的,收款人是无效的,默认的收款人是我们自己,但是提交的接口是有效的,所以转账转到我们账户

    如何通过CsrfViewMiddleWare中间件

    form表单提交

    只需要在写前端form表单的时候加上一个
    {% csrf_token %}

    ajax如何校验

    第一种:

    先写上 {% csrf_token %} ,在通过标签查找,放在data中传过去

    $.ajax({
        url:'',
        type:'post',
        data:{'name':'xc', 'csrfmiddlewaretoken': $('[name=csrfmiddlewaretoken]').val()}
    })
    

    第二种:

    直接使用 {{ scrf_token }}放在data中传过去

    
    
    $.ajax({
        url:'',
        type:'post',
        data:{'name':'xc', 'csrfmiddlewaretoken': {{ csrf_token }}}
    })
    

    第三种:

    使用官方文档写好的js文件,导入一下到html页面就可以了,就类似于JQuery文件的导入

    function getCookie(name) {
        var cookieValue = null;
        if (document.cookie && document.cookie !== '') {
            var cookies = document.cookie.split(';');
            for (var i = 0; i < cookies.length; i++) {
                var cookie = jQuery.trim(cookies[i]);
                // Does this cookie string begin with the name we want?
                if (cookie.substring(0, name.length + 1) === (name + '=')) {
                    cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                    break;
                }
            }
        }
        return cookieValue;
    }
    var csrftoken = getCookie('csrftoken');
    
    
    
    function csrfSafeMethod(method) {
      // these HTTP methods do not require CSRF protection
      return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
    }
    
    $.ajaxSetup({
      beforeSend: function (xhr, settings) {
        if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
          xhr.setRequestHeader("X-CSRFToken", csrftoken);
        }
      }
    });
    

    django中间件暴露给程序员五个可以自定义的方法

    五个方法都是在特定的条件下自动触发的

    创建自定义中间件步骤

    第一步:

    新建一个文件夹 里面新建一个任意名称的py文件
    里面写类 固定继承

    from django.utils.deprecation import MiddlewareMixin
    
    class MyMiddle(MiddlewareMixin): # 中间件
    	...
    
    

    第二步:

    去配置文件注册到中间件配置中

    MIDDLEWARE = [
        'django.middleware.security.SecurityMiddleware',
        'django.contrib.sessions.middleware.SessionMiddleware',
        'django.middleware.common.CommonMiddleware',
        'django.middleware.csrf.CsrfViewMiddleware',
        'django.contrib.auth.middleware.AuthenticationMiddleware',
        'django.contrib.messages.middleware.MessageMiddleware',
        'django.middleware.clickjacking.XFrameOptionsMiddleware',
        # 在这里加
        'app01.文件夹名.py文件名.MyMiddle'
    ]
    
    

    可以自定义的五个方法

    需要掌握:

    process_request:

    请求来的时候 会从上往下依次经过每一个中间件里面process_request,一旦里面返回了HttpResponse对象那么就不再往后执行了 会执行同一级别的process_response

    def process_request(self,request):
    	print('我是第一个自定义中间件里面的process_request方法')
    	return HttpResponse("我是第一个自定义中间件里面的HttpResponse对象返回值")  # 直接原地返回
    

    process_response

    响应走的时候 会从下往上依次进过每一个中间件里面的process_response

    def process_response(self,request,response):  # response就是要返回给用户的数据
    	print("我是第一个自定义中间件里面的process_response方法")
                                return response
    

    了解:

    • process_view:路由匹配成功之后执行视图函数之前触发
    • process_exception:当视图函数出现异常(bug)的时候自动触发
    • process_template_response:当视图函数执行完毕之后并且返回的对象中含有render方法的情况下才会触发

    全局csrf校验和全局不校验以及装饰器装饰CBV

    全局csrf校验的装饰器

    from django.views.decorators.csrf import csrf_exempt, csrf_protect

    csrf_exempt: 这个装饰器是忽略,也就是csrf不验证装饰了这个装饰器的视图函数.
    csrf_protect: 这个装饰器是保护,也就是如果没有设置csrf中间件,装饰了这个装饰器的视图函数是要验证的.

    装饰CBV

    from django.utils.decorators import method_decorator

  • 相关阅读:
    cannot import name 'PILLOW_VERSION'
    scala spark2.0 rdd dataframe 分布式计算欧式距离
    scala spark dataframe 修改字段类型
    获取cookie脚本
    Loadrunner 获取请求的返回结果函数web_reg_save_param
    Python模拟接口登录
    web自动化上传附件 2
    Web自动化附件上传
    robotframework 连接mysql数据库
    Json格式获取接口返回的值
  • 原文地址:https://www.cnblogs.com/xiongchao0823/p/11768588.html
Copyright © 2020-2023  润新知