Django中间件的定义:
中间件是一个用来处理Django的请求和响应的框架级别的钩子。它是一个轻量、低级别的插件系统,用于在全局范围内改变Django的输入和输出。
说的直白一点中间件是帮助我们在视图函数执行之前和执行之后都可以做一些额外的操作,它本质上就是一个自定义类,类中定义了几个方法,Django框架会在请求的特定的时间去执行这些方法。
自定义中间件:
1.process_request(self,request)
2.process_view(self, request, view_func, view_args, view_kwargs)
3.process_template_response(self,request,response)
4.process_exception(self, request, exception)
5.process_response(self, request, response)
以上方法的返回值可以是None或一个HttpResponse对象,如果是None,则继续按照django定义的规则向后继续执行,如果是HttpResponse对象,则直接将该对象返回给用户。
中间件------------------------>>>>>>>>>>>>> 中间件是一个用来处理django的响应与请求的框架级别的钩子.它是一个轻量,低级别的插件系统, 用于在全局范围内改变django的输入和输出,每个中间件组件都负责做一些特定的功能. ----简单来说,Django的中间件是一个类。用来在全局范围内处理请求和响应。 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 1. 执行时间 在视图函数之前执行 2. 参数 request 和视图中的request是同一个 3. 返回值 返回None 返回response对象 不执行后面中间的process_request方法和视图 直接执行当前值中间件的process_response方法 4. 执行顺序 按照注册的顺序执行 2. process_response 1. 执行时间 在视图函数之后执行 2. request, response request 和视图中的request是同一个 response 返回的response对象 3. 返回值 返回response对象 4. 执行顺序 按照注册的倒序执行 3. process_view 1. 执行时间 在视图函数之前,process_request之后执行 2. 参数 view_func 将要执行的视图函数 view_args 视图函数的可变长位置参数 view_kwargs 视图函数的可变长关键字参数 3. 返回值 返回 None 正常执行 返回 response对象 不执行后面的process_view和视图,直接执行所有中间件的process_response方法 4。执行顺序 按照注册的顺序执行 4. process_exception(有条件触发:有错误才执行) 1. 执行时间 在视图函数之后,process_response之前执行 2. 参数 exception 错误对象 3. 返回值 返回 None 不对错误进行处理,交给下一个中间件进行处理 返回 response对象 下一个中间的process_exception不执行,直接执行所有中间件的process_response方法 4. 执行顺序 按照注册的倒序执行 5. process_template_response(条件触发:视图返回的response有render方法) 1. 执行时间 在视图函数之后,process_response之前执行 2. 参数 3. 返回值 返回 response对象 4. 执行顺序 按照注册的倒序执行,执行完所有的process_template_response方法后执行response.render方法
上面中间件的流程:
""" 自定义的中间件 """ # 中间件只能返回None 和 HttpResponse from django.utils.deprecation import MiddlewareMixin class MyMiddle1(MiddlewareMixin): def process_request(self, request): print("开始第一个中间件") def process_view(self,request,view_func,view_args,view_kwargs): print("第一个process_view") print(view_func,type(view_func)) #函数的对象 def process_response(self, request,response): print("结束第一个中间件") return response class MyMiddle2(MiddlewareMixin): def process_request(self, request): print("开始第二个个中间件") # return HttpResponse("98k") def process_view(self,request,view_func,view_args,view_kwargs): print("第二个process_view") print(view_func,type(view_func)) #函数的对象 # return HttpResponse("oo98k") def process_response(self, request,response): print("结束第二个中间件") return response ''' url(r'^see_author/', views.see_author), 开始第一个中间件 开始第二个个中间件 第一个process_view <function see_author at 0x000000000B74F378> <class 'function'> 第二个process_view <function see_author at 0x000000000B74F378> <class 'function'> 结束第二个中间件 结束第一个中间件 '''
在settings.py的MIDDLEWARE配置项中注册上述两个自定义中间件:
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', 'middlewares.MD1', # 自定义中间件MD1 'middlewares.MD2' # 自定义中间件MD2 ]