1、Django自带7个中间件,每个中间件都有各自的功能
2、django能够自定义中间件
3、使用场景:
1. 全局身份校验
2. 全局用户权限校验
3. 全局访问频率的校验
......
class MyMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
# 在视图函数调用之前的预处理逻辑
# ...
response = self.get_response(request)
# 在响应返回给客户端之前的后处理逻辑
# ...
return response
请求操作和响应操作都需要经过中间件
1、请求来的时候需要先经过中间件才能真正到达后盾
2、响应返回的时候也要经过中间件后才能才能响应返回出去
SecurityMiddleware
django.middleware.security.SecurityMiddleware
SessionMiddleware
django.contrib.sessions.middleware.SessionMiddleware
CommonMiddleware
django.middleware.common.CommonMiddleware
CsrfViewMiddleware
django.middleware.csrf.CsrfViewMiddleware
AuthenticationMiddleware
django.contrib.auth.middleware.AuthenticationMiddleware
MessageMiddleware
django.contrib.messages.middleware.MessageMiddleware
XFrameOptionsMiddleware
django.middleware.clickjacking.XFrameOptionsMiddleware
例:
class AuthenticationMiddleware:
def process_request(self, request):
# 在这里进行身份验证操作
if not request.user.is_authenticated:
# 如果用户未经身份验证,则返回HttpResponse或重定向到登录页面
例:
class CustomResponseMiddleware:
def process_response(self, request, response):
# 在这里对响应进行处理
response['X-Custom-Header'] = 'Custom Value'
return response
示例:
class LoggingMiddleware:
def process_view(self, request, view_func, view_args, view_kwargs):
# 在这里记录日志
logger.info(f"Request received: {request.path}")
# 返回None,继续执行原视图函数
return None
示例:
class GlobalContextMiddleware:
def process_template_response(self, request, response):
# 在这里添加全局的上下文数据
response.context_data['global_data'] = "Global Value"
return response
示例:
class ErrorHandlerMiddleware:
def process_exception(self, request, exception):
# 在这里处理异常
if isinstance(exception, CustomException):
# 如果自定义异常,返回一个定制的错误页面
return render(request, 'error.html', {'error': str(exception)})
else:
# 默认情况,返回一个500服务器错误
return HttpResponseServerError("Internal Server Error")
def index(request):
print("这是视图函数index")
return HttpResponse("index 的返回值")
from app01 import views
urlpatterns = [
path('admin/', admin.site.urls),
path('index/',views.index),
]
# -*-coding: Utf-8 -*-
# @File : my_middle .py
# author: Chimengmeng
# blog_url : https://www.cnblogs.com/dream-ze/
# Time:2023/7/17
# 引入父类
from django.utils.deprecation import MiddlewareMixin
class MyMiddle(MiddlewareMixin):
def process_request(self, request):
print("这是第一个自定义中间件中的 process_request 方法")
class MyMiddle2(MiddlewareMixin):
def process_request(self, request):
print("这是第二个自定义中间件中的 process_request 方法")
注意:在自定义中间件的时候必须要继承父类MiddlewareMixin
引入父类:
from django.utils.deprecation import MiddlewareMixin
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',
# 注册自己的中间件(在应用下创建路径会有提示,但是如果在项目下创建就没有提示,需要自己根据路径书写)
'app01.mymiddle.my_middle.MyMiddle',
# 谁先注册就先执行谁
'app01.mymiddle.my_middle.MyMiddle2',
]
1、如果在第一个 process_request 方法就已经返回了 HttpResponse 对象,那么响应被返回的时候是经过所有的中间件里面的 process_response 方法还是会发生其他?
会直接走同级别的 process_response 方法 ,然后直接返回
2、flask框架的中间件也有一个类似的方法
但是flask返回数据就必须经过所有中间件里面的 process_response 方法