django wsgi middlware 执行顺序 按照settings中MIDDLEWARE的顺序
process_request和process_view均按照上述里面的顺序来执行
process_response按照MIDDLEWARE逆序执行
下面写一个程序来验证
from django.http import HttpResponse
from django.shortcuts import redirect
from django.urls import reverse
from django.utils.deprecation import MiddlewareMixin
from django.views.debug import technical_500_response
import sys
class middle1(MiddlewareMixin):
def process_request(self,request):
print("这是第一个中间程序请求路径是:",request.path_info)
def process_response(self, request, response):
print("第一个响应")
return response # 必须返回相应对象
def process_view(self, request, view_func, view_args, view_kwargs):
print("在自己的视图函数之前执行")
# 异常处理
def process_exception(self, request, exception):
print("exception")
ip = request.META.get('REMOTE_ADDR')
# 如果请求的IP地址是管理员登录服务器调试可以看到错误页面否则就跳转一个固定错误页面这里为了测试搞了admin
if ip == '127.0.0.1':
return technical_500_response(request, *sys.exc_info())
return redirect(reverse("/admin"))
class middle2(MiddlewareMixin):
def process_request(self,request):
print("这是第二个中间程序请求路径是:",request.path_info)
def process_response(self, request, response):
print("第二个响应")
return response # 必须返回相应对象
def process_view(self, request, view_func, view_args, view_kwargs):
print("在第二个自己的视图函数之前执行")
def process_exception(self, request, exception):
print("exception")
ip = request.META.get('REMOTE_ADDR')
#如果请求的IP地址是管理员登录服务器调试可以看到错误页面否则就跳转一个固定错误页面这里为了测试搞了admin
if ip == '127.0.0.1':
return technical_500_response(request, *sys.exc_info())
return redirect(reverse("/admin"))
MIDDLEWARE如下
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
# 'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'utils.middleware.middle1',
'utils.middleware.middle2',
]
执行结果如下
process_request和process_view按照middle1,middle2顺序来执行
process_response按照middle2和middle1的顺序执行
请求路径
但是如果在process_request中直接返回Httpresponse那么之后的middleware里面process_request,process_response都不会执行了,但是这个包括之前的process_request和process_response都会执行,但是所有process_view都不会执行看下面例子
from django.http import HttpResponse
from django.shortcuts import redirect
from django.urls import reverse
from django.utils.deprecation import MiddlewareMixin
from django.views.debug import technical_500_response
import sys
class middle1(MiddlewareMixin):
def process_request(self,request):
print("这是第一个中间程序请求路径是:",request.path_info)
def process_response(self, request, response):
print("第一个响应")
return response # 必须返回相应对象
def process_view(self, request, view_func, view_args, view_kwargs):
print("在自己的视图函数之前执行")
# 异常处理
def process_exception(self, request, exception):
print("exception")
ip = request.META.get('REMOTE_ADDR')
# 如果请求的IP地址是管理员登录服务器调试可以看到错误页面否则就跳转一个固定错误页面这里为了测试搞了admin
if ip == '127.0.0.1':
return technical_500_response(request, *sys.exc_info())
return redirect(reverse("/admin"))
class middle2(MiddlewareMixin):
def process_request(self,request):
print("这是第二个中间程序请求路径是:",request.path_info)
def process_response(self, request, response):
print("第二个响应")
return response # 必须返回相应对象
def process_view(self, request, view_func, view_args, view_kwargs):
print("在第二个自己的视图函数之前执行")
def process_exception(self, request, exception):
print("exception")
ip = request.META.get('REMOTE_ADDR')
#如果请求的IP地址是管理员登录服务器调试可以看到错误页面否则就跳转一个固定错误页面这里为了测试搞了admin
if ip == '127.0.0.1':
return technical_500_response(request, *sys.exc_info())
return redirect(reverse("/admin"))
class middle3(MiddlewareMixin):
def process_request(self,request):
print("这是第三个中间程序请求路径是:",request.path_info)
def process_response(self, request, response):
print("第三个响应")
return response # 必须返回相应对象
def process_view(self, request, view_func, view_args, view_kwargs):
print("在第三个自己的视图函数之前执行")
def process_exception(self, request, exception):
print("exception")
ip = request.META.get('REMOTE_ADDR')
#如果请求的IP地址是管理员登录服务器调试可以看到错误页面否则就跳转一个固定错误页面这里为了测试搞了admin
if ip == '127.0.0.1':
return technical_500_response(request, *sys.exc_info())
return redirect(reverse("/admin"))
class middle4(MiddlewareMixin):
def process_request(self,request):
print("这是第四个中间程序请求路径是:",request.path_info)
def process_response(self, request, response):
print("第四个响应")
return response # 必须返回相应对象
def process_view(self, request, view_func, view_args, view_kwargs):
print("在第四个自己的视图函数之前执行")
def process_exception(self, request, exception):
print("exception")
ip = request.META.get('REMOTE_ADDR')
#如果请求的IP地址是管理员登录服务器调试可以看到错误页面否则就跳转一个固定错误页面这里为了测试搞了admin
if ip == '127.0.0.1':
return technical_500_response(request, *sys.exc_info())
return redirect(reverse("/admin"))
class middle5(MiddlewareMixin):
def process_request(self,request):
print("这是第五个中间程序请求路径是:",request.path_info)
def process_response(self, request, response):
print("第五个响应")
return response # 必须返回相应对象
def process_view(self, request, view_func, view_args, view_kwargs):
print("在第五个自己的视图函数之前执行")
def process_exception(self, request, exception):
print("exception")
ip = request.META.get('REMOTE_ADDR')
#如果请求的IP地址是管理员登录服务器调试可以看到错误页面否则就跳转一个固定错误页面这里为了测试搞了admin
if ip == '127.0.0.1':
return technical_500_response(request, *sys.exc_info())
return redirect(reverse("/admin"))
直接写了五个自己编写的中间件
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
# 'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'utils.middleware.middle1',
'utils.middleware.middle2',
'utils.middleware.middle3',
'utils.middleware.middle4',
'utils.middleware.middle5',
]
还是访问admin后台管理
把middle4改写成
class middle4(MiddlewareMixin):
def process_request(self,request):
print("这是第四个中间程序请求路径是:",request.path_info)
return HttpResponse("hello world")
process_view都没有执行,但是process_request,process_response都顺序执行