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都还会执行:

浙公网安备 33010602011771号