中间件
""" 如果你想修改请求,例如被传送到view中的HttpRequest对象。 或者你想修改view返回的HttpResponse对象,这些都可以通过中间件来实现。 可能你还想在view执行之前做一些操作,这种情况就可以用 middleware来实现。 大家可能频繁在view使用request.user吧。 Django想在每个view执行之前把user设置为request的属性,于是就用了一个中间件来实现这个目标。 所以Django提供了可以修改request 对象的中间件 AuthenticationMiddleware。 """ #(一) # 定义中间件 # 项目/middleware/mymiddleware.py # 需要导入: from django.utils.deprecation import MiddlewareMixin # 自定义中间件必须要继承MiddlewareMixin class MyMiddleware(MiddlewareMixin): #中间件中一共有四个方法: # process_request # 请求 # # process_view # 视图 # # process_exception # 报错 # # process_response # 响应 # 四中方法大概流程为:例如:两个自定义中间件,每个中间件中自定义了四种方法 # 流程为: 请求(1-2) --> url路由关系映射 --> 视图(1-2) --> 视图函数 --> 报错(2-1) --> 响应(2-1) # 注意process_request方法: # 当请求有返回值时:如果当请求到达请求1的时候直接不符合条件返回,即return HttpResponse("Md1中断"),程序将把请求直接发给中间件1返回,返回到请求者,即 请求 -- > 响应 # 当请求无返回值,或返回 None 时,则依次往下执行中间件流程 # 注意process_view方法: # process_view可以用来调用视图函数 ''' def process_view(self, request, callback, callback_args, callback_kwargs): # return HttpResponse("hello") response=callback(request,*callback_args,**callback_kwargs) return response ''' # process_view如果有返回值,会越过其他的process_view以及视图函数,但是所有的process_response都还会执行。 即 请求 --> 视图 --> 响应 # 注意process_response方法: # 必须要返回 response 响应 # 四大方法的基本格式: ''' def process_request(self,request): print("Md1请求") #return HttpResponse("Md1中断") def process_response(self,request,response): print("Md1返回") return response def process_view(self, request, callback, callback_args, callback_kwargs): # return HttpResponse("hello") # response=callback(request,*callback_args,**callback_kwargs) # return response print("md1 process_view...") def process_exception(self): print("md1 process_exception...") ''' # 最常用的模式是:请求 -- > 视图函数处理 -- > 响应 # 当用户发起请求的时候会依次经过所有的的中间件,这个时候请求先经过process_request方法,最后到达views的函数中, # views函数处理后,在依次穿过中间件,这个时候经过process_response,最后返回给请求者。 # 若对响应没有操作可以不写,即 只有 process_request 方法 #(二) # 在settings中添加自定义中间件 ''' 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.mymiddleware.MyMiddleware', # 中间件路径.自定义中间件类名 ] '''
流程图:
这样当用户发起请求的时候到达中间件3的process_request之后会到达urls路由关系映射这里,如果匹配到了就会到中间件1的process_view,然后依次传递到中间件3的process_view,到达view函数。如果view函数中有报错,则会从中间件3依次向上判断每个中间件的process_exception是否能匹配到这个错误信息,如果匹配到则直接返回到最后一个中间件,这里即中间件3的process_response,然后依次返回到用户,如果没有匹配到这个错误则直接在页面显示错误信息。如果view函数中没有错误,则到中间3即最后一个中间件3的process_response,然后依次向上,传到用户。
中间件之process_template_responseprocess
process_template_response(self,request,response)
只有当views函数中返回的对象中具有render方法,才会被调用。