中间件

中间件

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

关于中间件 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

posted @ 2019-10-30 22:57  cheerxiong  阅读(175)  评论(0编辑  收藏  举报