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',
# 定义了2个自定义的中间件
'middle.md.middle_first',
'middle.md.middle_second'
]
#Auther Bob
#--*--conding:utf-8 --*--
from django.utils.deprecation import MiddlewareMixin
import time
from django.shortcuts import HttpResponse
# 中间件就是一个类,下面我们自定义了2个中间件,中间件又叫做管道
class middle_first(MiddlewareMixin):
def process_request(self,request):
print("middle_first--process_request",time.time())
return HttpResponse("大爷慢走")
def process_response(self,request,response):
print("middle_first--process_response", time.time())
print(response, type(response))
return response
class middle_second(MiddlewareMixin):
def process_request(self,request):
print("middle_second--process_request",time.time())
def process_response(self,request,response):
print("middle_second--process_response", time.time())
print(response,type(response))
return response
中间件函数的参数是固定的
先看process_request方法,参数有一个request
def process_request(self,request):
path = request.path_info
# l = path.split("/")
# if l[2] in black_list:
# return HttpResponse("不能访问")
re_compile_obj = re.compile("/")
l = re_compile_obj.split(path)
for i in l:
if i in black_list:
return HttpResponse("不能访问")
在看process_response方法,参数必须要要有个response,这个参数必须要有,而且这个process_response的函数必须要有返回值,如果没有,django会把报错的,最后一个中间件的process_response把返回值返回给倒数第一个中间件的process_response函数,然后在返回倒数第三个中间件的process_response函数,这个参数默认就是视图函数的返回,我们也可以自定义返回值,下面的例子就是我们自定义返回值,process_response是按照注册顺序的倒序执行
def process_response(self,request,response):
print("--------->","这个是response的中间件")
return HttpResponse("中间件直接返回的")
结果如下
我们还使用默认的response的返回值,也就是用视图函数的返回值
def process_response(self,request,response):
print("--------->","这个是response的中间件")
# return HttpResponse("中间件直接返回的")
return response
结果如下
process_view函数,多个中间件的process_view函数是按照注册的正序执行,在执行视图函数之前执行,如果有返回值,则不会执行视图函数的方法,执行返回执行process_response函数,如果没有返回值,则会执行完process_view后在执行视图函数
def process_view(self,request,view_func,view_args,view_kwargs):