Django框架之七 -->中间件
Django请求流程图
请求和响应穿过了一层层的中间件,中间件是什么
随便点开一个
# django.middleware.common.CommonMiddleware class CommonMiddleware(MiddlewareMixin): response_redirect_class = http.HttpResponsePermanentRedirect def process_request(self, request): ... def should_redirect_with_slash(self, request): ... def get_full_path_with_slash(self, request): ... def process_response(self, request, response): ... def needs_etag(self, response): ...
原来中间件就是一个一个的类
process_request方法
request请求穿过中间件时执行的方法,没有返回值(None),设置返回值不为空,request请求不会向后执行,会从本层的porcess_response往回返回response
process_response方法
response响应穿过中间件时执行的方法,他返回respoonse对象,不返回响应不会向后执行
使用上面两个方法就能够自定义一个中间件
中间件登录验证
# 在随便一个文件里 from django.utils.deprecation import MiddlewareMixin from django.shortcuts import HttpResponse,redirect class AuthMiddleware(MiddlewareMixin): def process_request(self,request): # 如果么有返回值;返回None,表示可以继续往下执行 # 如果有返回值,执行自己的response以及以上的response。 # 如果请求的路径为登录的路径,return None继续向后执行 if request.path_info == '/login/': return None # 从session中取值 user_info = request.session.get('user_info') # 没取到跳转到登录页,反之向后执行 if not user_info: return redirect('/login/') def process_response(self,request,response): return response
然后把这个类映射到中间件中(中间件的顺序很重要)
MIDDLEWARE = [ ... "xxx.xxx.AuthMiddleware" # 路径 ]
另外两个
process_view
流程图
process_view位于路由与视图之间
process_view可以用来调用视图函数:
class Md1(MiddlewareMixin): 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") # callback是将要调用的函数,, callback_args, callback_kwargs是参数 response=callback(request,*callback_args,**callback_kwargs) return response
注意:process_view如果有返回值,会越过其他的process_view以及视图函数,但是所有的process_response都还会执行
process_exception
箭头代表方向,黄色线代表实际穿过的,灰线只起指示作用.
当views出现错误时中间件中的process_exception就会被执行,return之后会越过其他的process_exception以及视图函数,但是所有的process_response都还会执行: