中间件
如果涉及到全局的功能 就应该考虑使用中间件
关于中间件 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