1.什么是中间件
Django的中间件类似于是Django的保安
请求来的时候需要先经过中间件才能到达Django的后端
响应走的时候也需要经过中间件才能到达web服务网关接口
官方的说法:中间件是一个用来处理Django的请求和响应的框架级别的钩子。它是一个轻量、低级别的插件系统,用于在全局范围内改变Django的输入和输出。每个中间件组件都负责做一些特定的功能。
但是由于其影响的是全局,所以需要谨慎使用,使用不当会影响性能。
说的直白一点中间件是帮助我们在视图函数执行之前和执行之后都可以做一些额外的操作,它本质上就是一个自定义类,类中定义了几个方法,Django框架会在请求的特定的时间去执行这些方法。
中间件在Django中就位于settings.py文件中的MIDDLEWARE配置项
# 下面这几行代码就是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', ]
MIDDLEWARE配置项是一个列表(列表是有序的,记住这一点,后面你就知道为什么要强调有序二字),列表中是一个个字符串,这些字符串其实是一个个类,也就是一个个中间件。
我们之前已经接触过一个csrf相关的中间件了?我们一开始让大家把他注释掉,再提交post请求的时候,就不会被forbidden了,我们学会使用csrf_token之后就不再注释这个中间件了。
Django中间件可以用来做什么
1.网站全集的身份校验,访问频率限制,权限校验,涉及到全局的校验都可以在中间件中完成
2.Django的中间件是所有web框架中做的最好的
2.自定义中间件
中间件可以定义五个方法,分别是:(主要的是process_request和process_response)
process_request(self,request)
process_view(self,request,view_func,view_args,view_kwargs)
process_template_response(self,request,response)
process_exception(self,request,exception)
process_response(self,request,response)
以上方法的返回值可以是None或一个HttpResponse对象,如果是None,则继续按照django定义的规则向后继续执行,如果是HttpResponse对象,则直接将该对象返回给用户。
如何自定义我们自己的中间件
1.如果想让自己写的中间件生效,就必须先继承MiddlewareMixin
2.在注册自定义中间件的时候,一定要确保路径不能写错
需要掌握的两个方法
process_request(self,request)方法和process_response(self,request,response)方法
from django.utils.deprecation import MiddlewareMixin from django.shortcuts import HttpResponse class MyMdd(MiddlewareMixin): def process_request(self,request): print('我是第一个中间件里的process_request方法') def process_response(self,request,response): print('我是第一个中间件里的process_response方法') return response class MyMdd1(MiddlewareMixin): def process_request(self,request): print('我是第二个中间件里的process_request方法') return HttpResponse('第二个中间件就返回了') def process_response(self,request,response): print('我是第一个中间件里的process_response方法') return response class MyMdd2(MiddlewareMixin): def process_request(self,request): print('我是第三个中间件里的process_request方法') def process_response(self,request,response): print('我是第一个中间件里的process_response方法') return response