中间件是一个用来处理Django的请求和响应的框架级别的钩子。它 是一个轻量、低级别的插件系统,用于在全局范围内改变Django的输入和输出。html
在Django项目的setting.py文件中前端
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', ]
中间件是按照配置文件中的顺序来执行地python
在项目的任意位置新建一个文件夹,文件夹中新建任意一个.py文件,在文件中添加以下内容:ajax
from django.utils.deprecation import MiddlewareMixin class MyMiddle(MiddlewareMixin): ...
上面就是一个没有任何方法的中间件,若是想要让Django运行你定义的中间件,那么就须要在你的setting.py文件中配置中间件django
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', 'middlewareMixin.log_auth.MyMiddle', # : 就是这个 ]
Django为用户提供了五个中间件的方法,经常使用的只有两个:后端
process_request(self, request)浏览器
当请求来时,会触发这个方法,在将request传给视图函数以前能够对request进行一系列操做服务器
def process_request(self, request): print("请求来时会走这个")
若是咱们在这个方法里面返回了HttpResponse对象,那么便会触发当前对象中的process_response方法,并原路返回给浏览器cookie
def process_request(self, request): return HttpResponse("你的请求不符合个人要求,拒绝访问!")
process_response(self, request, response)session
上面咱们讲到会触发同级的process_response方法,这个方法必须将response返回,而且必须是按照这个位置写,由于调用这个方法的传参方式是按照位置传参,第二个就是response对象
def process_response(self, request, response): print("响应时会走这个") return response
process_view
当咱们的路由匹配成功以后,在视图函数执行以前
process_exception
当视图函数出现异常时自动触发
process_template_response
当视图函数执行完毕,返回的HttpResponse对象中包含render方法时才会触发
跨站请求伪造就是至关于钓鱼网站。模仿一个正常的网站来盗取得你用户名密码之类的。
只要是用户想要提交post请求的页面 我在返回给用户的时候就提早设置好一个随机字符串
在Django中已经为咱们写好了一个解决跨站请求伪造的中间件,咱们只须要会使用就能够了
form表单提交
咱们只须要在form表单中添加 {% csrf_token %}
通过后端页面渲染就会变成一个隐藏的input框,框内的值就是服务器生成的随机字符串
ajax提交
第一种:在页面上随便一个地方添加 {% csrf_token %}
经过获取值
第二种:直接在ajax的data数据中添加一组键值对:'csrfmiddlewaretoken':'{{ csrf_token }}'
第三种:经过js来获取csrf
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; } $.ajax({ url: "", type: "post", headers: {"X-CSRFToken": getCookie('csrftoken')}, success: function (res) { alert(res); } })
咱们除了能够在前端页面上设置csrf以外还能够在后端设置本次请求不校验
FBV
from django.views.decorators.csrf import csrf_exempt @csrf_exempt # 只要加装了这个装饰糖那么就不会对这个接口进行csrf检测 def test_csrf(request): if request.method == "POST": return HttpResponse("成功接收请求!") return render(request, "test.html")
CBV
from django.views.decorators.csrf import csrf_exempt from django.utils.decorators import method_decorator # 第一种 # @method_decorator(csrf_exempt,name='dispatch') # 将装饰器加装在类上面指定dispatch方法 class MyCsrf(View): # 第二种 # 将装饰器加装在dispatch方法上面 @method_decorator(csrf_exempt) def dispatch(self, request, *args, **kwargs): return super().dispatch(request, *args, **kwargs) def get(self, request): return HttpResponse('hahaha') def post(self, request): return HttpResponse("成功接收请求!")