def simple_middleware(get_response): # 此处编写的代码仅在Django第一次配置和初始化的时候执行一次。 def middleware(request): # 此处编写的代码会在每个请求处理视图前被调用。 response = get_response(request) # 此处编写的代码会在每个请求处理视图之后被调用。 return response return middleware
实例:
在book子应用中创建文件middleware.py,并定义中间件:
def my_middleware(get_response): print(‘init 被调用‘) def middleware(request): print(‘before request 被调用‘) response = get_response(request) print(‘after response 被调用‘) return response return middleware
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‘, ‘book.middleware.my_middleware‘, # 添加中间件 ]
def test_view(request): print(‘test_view视图代码执行‘) return HttpResponse(f"index, param:{request.body}")
访问这个视图结果:
before request 被调用
test_view视图代码执行
after response 被调用
说明:
中间件:
def my_middleware(get_response): print(‘init 被调用‘) def middleware(request): print(‘before request my_middleware111111被调用‘) response = get_response(request) print(‘after response my_middleware111111被调用‘) return response return middleware def my_middleware2(get_response): print(‘init 被调用‘) def middleware(request): print(‘before request my_middleware22222被调用‘) response = get_response(request) print(‘after response my_middleware22222被调用‘) return response return middleware
配置:
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‘, ‘book.mw.my_middleware‘, # 中间件1 ‘book.mw.my_middleware2‘, # 中间件2 ]
before request my_middleware111111被调用
before request my_middleware22222被调用
test_view视图代码执行
after response my_middleware22222被调用
after response my_middleware111111被调用
说明:中间件1相当于在中间2外面再套一层,其实就是视图上加了多个装饰器
原文:https://www.cnblogs.com/liuxuelin/p/14299951.html