中间件
如果涉及到全局的功能 就应该考虑使用中间件
关于中间件 django.middleware.csrf.CsrfViewMiddleware
这个中间件是解决跨站伪类请求而设置的
在前端随机生成一个设置好的随机字符串,提交到我们的数据提交接口的时候就校验,有就提交,没有就403
跨扎伪类请求
跨扎伪类请求,其实就是一个钓鱼网站
原理
- 搭建一个和转账网站一模一样的网站
- form表单中action提交的地址提交到正规网站一样的地址
- 设置一个暴露给用户的收款人的提交框
- 提前隐藏一个收款人的提交框,默认是自己的账户,就是有name和value的input框
- 用户一旦输入,只有用户名和密码是有效的,收款人是无效的,默认的收款人是我们自己,但是提交的接口是有效的,所以转账转到我们账户
如何通过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