一、什么是中间件:
官方的说法:中间件是一个用来处理Django的请求和响应的框架级别的钩子。它是一个轻量、低级别的插件系统,用于在全局范围内改变Django的输入和输出。每个中间件组件都负责做一些特定的功能。
但是由于其影响的是全局,所以需要谨慎使用,使用不当会影响性能。
说的直白一点中间件是帮助我们在视图函数执行之前和执行之后都可以做一些额外的操作,它本质上就是一个自定义类,类中定义了几个方法,Django框架会在请求的特定的时间去执行这些方法。
我们一直都在使用中间件,只是没有注意到而已,打开Django项目的Settings.py文件,看到下图的MIDDLEWARE配置项。
二、Django中默认有七个中间件
MIDDLEWARE配置项是一个列表(列表是有序的,记住这一点,后面你就知道为什么要强调有序二字),列表中是一个个字符串,这些字符串其实是一个个类,也就是一个个中间件。
接下来我们先大致画一张Django的请求生命周期:
三、Django中间件:
Django中间件默认有七个中间件,只要你想要做一些网站的全局性功能,你都应该考虑使用Django中间件。
1.全局的用户登录校验,
2.全局的用户访问频率校验,
3.全局的用户权限校验,
Django的中间件是所有框架里面做的是最完善的,并且支持用户自定义中间件,
四、自定义中间件:
中间件可以定义五个方法:
自定义中间之前需要先导入模块创建类,在类中定义五中自定义方法:
from django.utils.deprecation import MiddlewareMixin from django.shortcuts import HttpResponse, render, redirect class MyMdd1(MiddlewareMixin):
五中自定义方法:
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)
(1).process_request (重要!!!)
def process_request(self, request): print('我是第一个中间件里面的process_request方法') #1.请求来的时候会按照settings配置文件中从上往下的顺序 依次执行每一个中间件内部定义的process_request方法。 #2.该方法一旦返回了HttpResponse对象,那么请求会立刻停止往后走 原路立即返回
(2).process_response (需要掌握)
def process_response(self, request, response): """ :param request: :param response: 就是后端返回给前端的数据 :return: """ print('我是第一个中间件里面的process_response方法') return response #1.响应走的时候会按照settings配置文件中从下往上的顺序 依次执行每一个中间件内部定义的process_response方法. #2.该方法必须有两个形参 并且必须返回response形参 不返回直接报错. #3.该方法返回什么(HttpResponsed对象) 前端就能获得什么. # 当process_request方法直接返回HttpResponse对象之后 会直接从当前中间件里面的process_respone往回走 # 没有执行的中间件都不会再执行
(3).process_view (需要了解)
def process_view(self, request, view_name, *args, **kwargs): print(view_name) print(args) print(kwargs) print('我是第一个中间件里面的process_view方法') return HttpResponse("我是中间件一里面的process_view") #1.路由匹配成功之后执行视图函数之前触发 #2.如果该方法返回了HttpResponse对象 ,那么会从下往上一次经过每一个中间件里面的process_response方法
(5).process_template_response(需要了解)
def process_template_response(self, request, response): print('我是第一个中间件里面的奇葩方法') return response #1.当你返回的对象中含有render属性指向的是一个render方法的时候才会触发 从下往上的顺序. #当视图函数中生成这样一个函数才会被调用: def mdzz(request): print('我是视图函数mdzz') def render(): return HttpResponse('你好呀 我是奇葩') obj = HttpResponse('我很好 好的像个傻逼一样') obj.render = render return obj
(5).process_exception(需要了解)
def process_exception(self, request, exception): print('我是第一个中间件里面的process_exception') print(exception) #1.当视图函数中出现错误 会自动触发 顺序是从下往上,
上面五个方法,会在特定的阶段自动触发。
特别注意:如果形参中含由response,那么必须要返回