从上面的图可以看出,任何一个URL在进入路由系统之前,首先进入的是中间件。因此,对于某些需要大规模处理一些函数的时候,可以使用中间件,对于只需要个别函数添加功能,应该使用装饰器。
定义:
中间件的本质就是很多的类,在类中有很多的方法,在一次URL进来之后这些类的方法会自动被调用执行。
所有的中间件类都有两个方法:
process_request()
process_response(),此方法必须设置返回值
自定义中间件:
在项目的根目录下创建任意名字的包文件夹,然后在新创建的文件夹下创建任意名字的py文件。py文件的代码如下:
1 from django.utils.deprecation import MiddlewareMixin 2 from django.shortcuts import HttpResponse,redirect 3 4 5 class AuthMiddleware(MiddlewareMixin):#所有的中间件必须继承MiddlewareMixin类 6 # 客户端发来请求之后要执行的函数 7 def process_request(self,request): 8 # 这里是为/login/页面添加到白名单,即/login/不需要进行Session认证。设置返回值为None,即本中间件不对其做任何 9 # 处理,交给后续步骤处理 10 if request.path_info == "/login/": 11 return None 12 13 #任何页面在显示之前都要进行Session验证 14 user_info = request.session.get("user_info") 15 # 如果从用户的请求中获取不到Session的值,则跳转到login页面 16 if not user_info: 17 url = request.get_full_path() 18 # 将之前要访问的地址作为参数拼接到login url后面 19 return redirect(‘/login/?from={}‘.format(url)) 20 # 服务端给客户端回应要执行的函数 21 def process_response(self,request,response): 22 return response
注册自定义的中间件
1 MIDDLEWARE = [ 2 ‘django.middleware.security.SecurityMiddleware‘, 3 ‘django.contrib.sessions.middleware.SessionMiddleware‘, 4 ‘django.middleware.common.CommonMiddleware‘, 5 ‘django.middleware.csrf.CsrfViewMiddleware‘, 6 ‘django.contrib.auth.middleware.AuthenticationMiddleware‘, 7 ‘django.contrib.messages.middleware.MessageMiddleware‘, 8 ‘django.middleware.clickjacking.XFrameOptionsMiddleware‘, 9 ‘app01.middleware.auth.AuthMiddleware‘, 10 ]