一:中间件基础简介
(1)简介:
(1)中间件是在视图函数执行之前与执行之后可以进行的一些额外操作
(2)其本质是一个自定义的类 类中定义了几个方法 其会在特定的条件触发这些方法
(2)作用:
(1):django中间件 可以用来进行身份校验 访问频率限制 权限校验
(2):只要涉及全局校验都可以使用中间件进行校验
(3)django默认中间件
(1)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', ]
(4)django请求生命周期
PS:
(1)上述当客户端的请求到达中间件的时候 其首先会查找缓存数据库
(2)如果缓存数据库查找不到 最终到达数据库查找
(3)当数据库将查找的数据返回 经过中间件的时候 其会将数据分成两份
(4)一份存入缓存数据库中 一份传输给客户端
(5)下次客户端再次获取相同的数据的时候 其不会在进行数据库查询 而是直接去缓存数据库查询
二:自定义中间件
(1)常见自定义方法
(1)process_request(self,request)
(2)process_view(self, request, view_func, view_args, view_kwargs)
(3)process_template_response(self,request,response)
(4)process_exception(self, request, exception)
(5)process_response(self, request, response)
(2)自定义方法使用示例
(1)文件创建图解

from django.utils.deprecation import MiddlewareMixin class MyMiddleWareM1(MiddlewareMixin): pass class MyMiddleWareM2(MiddlewareMixin): pass class MyMiddleWareM3(MiddlewareMixin): pass
(2)process_request

from django.utils.deprecation import MiddlewareMixin class MyMiddleWareM1(MiddlewareMixin): def process_request(self, request): print('我是第一个自定义中间件中的 request方法') class MyMiddleWareM2(MiddlewareMixin): def process_request(self, request): print('我是第一个自定义中间件中的 request方法') class MyMiddleWareM3(MiddlewareMixin): def process_request(self, request): print('我是第一个自定义中间件中的 request方法')
def index(request): print('index 视图函数') return HttpResponse('index 视图函数')
PS:
(1)请求来的时候 会在中间件列表中从上至下依次进行 最后走视图函数
PS:
(1)一旦遇到中间件返回值为HttpResponse对象的时候 就不会再继续往下执行别的中间件
(2)前端收到的返回值 也是为中间件的返回值 而不是后端视图函数的返回值
(3)process_response

class MyMdd(MiddlewareMixin): def process_response(self, request, response): print('我是第一个中间件里面的process_response方法') class MyMdd1(MiddlewareMixin): def process_response(self, request, response): print('我是第二个中间件里面的process_response方法') class MyMdd2(MiddlewareMixin): def process_response(self, request, response): print('我是第三个中间件里面的process_response方法')
PS:
(1)中间件必须将response返回
(2)response包含 后端给前端返回的消息格式
PS:
(1)后端进行相应的时候 中间件执行顺序 为中间件列表从下往上开始执行
(4)process_view

class MyMdd(MiddlewareMixin): def process_view(self, request, view_func, view_args, view_kwargs): print('我是第一个中间件里面的process_view方法') class MyMdd1(MiddlewareMixin): def process_view(self, request, view_func, view_args, view_kwargs): print('我是第二个中间件里面的process_viewe方法') class MyMdd2(MiddlewareMixin): def process_view(self, request, view_func, view_args, view_kwargs): print('我是第三个中间件里面的process_view方法')
PS:
(1)其会在执行视图函数之前触发该方法
(2)在触发该方法的时候 会拿到后端视图函数的内存地址
(5)process_exception

class MyMdd(MiddlewareMixin): def process_exception(self, request, exception): print(exception) # name 'asdasdasd' is not defined print('我是第一个中间件里面的process_exception方法') class MyMdd1(MiddlewareMixin): def process_exception(self, request, exception): print('我是第二个中间件里面的process_exception方法') class MyMdd2(MiddlewareMixin): def process_exception(self, request, exception): print('我是第三个中间件里面的process_exception方法')
def index(request): print('index 视图函数') asdasdasd return HttpResponse('index 视图函数')
# 结果展示 index 视图函数 我是第三个中间件里面的process_exception方法 我是第二个中间件里面的process_exception方法 name 'asdasdasd' is not defined 我是第一个中间件里面的process_exception方法
PS:
(1)其会在后端代码运行错误的时候触发该方法运行
(2)中间件执行顺序 在中间件列表自上而下执行
(6)process_template_response
def index(request): print('我是index视图函数') def render(): return HttpResponse('什么鬼玩意') obj = HttpResponse('index') obj.render = render return obj
PS:
(1)当你返回的HttpResponse对象中必须包含render属性才会触发