django - 总结 - 中间件

时间:2023-03-09 02:15:07
django - 总结 - 中间件

中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出。因为改变的是全局,所以需要谨慎实用,用不好会影响到性能。

 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',
]
中间件的四个方法

process_request(self,request)
当用户发起请求的时候会依次经过所有的的中间件,这个时候的请求时process_request,最后到达views的函数中 process_response(self,request,reponse)
views函数处理后,在依次穿过中间件,这个时候是process_response,最后返回给请求者。 process_view(self, request, callback, callback_args, callback_kwargs) process_exception(self)  # 默认不执行

process_template_response()只有在视图函数的返回对象中有render方法才会执行!

 

django - 总结 - 中间件

自定义中间件

自己写一个类,但是必须继承MiddlewareMixin
from django.utils.deprecation import MiddlewareMixin

django - 总结 - 中间件

 def index(request):

     print("view函数...")
return HttpResponse("OK")

index()

 from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse class Md1(MiddlewareMixin): def process_request(self,request):
print("Md1请求") def process_response(self,request,response):
print("Md1返回")
return response class Md2(MiddlewareMixin): def process_request(self,request):
print("Md2请求")
#return HttpResponse("Md2中断")
def process_response(self,request,response):
print("Md2返回")
return response

Mymiddlewares.py

中间件版的登录验证

from django.shortcuts import redirect, HttpResponse
from django.utils.deprecation import MiddlewareMixin class AuthMD(MiddlewareMixin):
white_list = ['/login/', ] # 白名单
black_list = ['/black/', ] # 黑名单 def process_request(self, request):
next_url = request.path_info
print(request.path_info, request.get_full_path()) if next_url in self.white_list or request.session.get("user"):
return
elif next_url in self.black_list:
return HttpResponse('This is an illegal URL')
else:
return redirect("/login/?next={}".format(next_url))
# 正常情况下返回None