[TOC]
Django中间件
**中间件介绍:**中间件是一个用来处理Django的请求和响应的框架级别的钩子。它是一个轻量、低级别的插件系统,用于在全局范围内改变Django的输入和输出。每个中间件都负责做一些特定的功能。
说的直白点中间件就是帮助我们在视图函数执行之前和执行之后都可以做一些额外的操作,它本质上是一个自定义类,类中定义了几个方法,Django框架会在请求的特定的时间去执行这些方法。
Django中有7个默认的中间件:
1# settings.py 2 3MIDDLEWARE = [ 4 'django.middleware.security.SecurityMiddleware', 5 'django.contrib.sessions.middleware.SessionMiddleware', 6 'django.middleware.common.CommonMiddleware', 7 'django.middleware.csrf.CsrfViewMiddleware', 8 'django.contrib.auth.middleware.AuthenticationMiddleware', 9 'django.contrib.messages.middleware.MessageMiddleware', 10 'django.middleware.clickjacking.XFrameOptionsMiddleware', 11]
<span style='color:red'>在Django的生命周期中,浏览器输入网址经过web服务网关接口(wsgiref)然后还要经过Django中间件才会到Django的路由层(请求来的时候,Django中间件是自上而下顺序执行,一旦某个中间件拦截了请求,后面的将不再执行。响应走的时候,Django中间件是自下而上逆序执行。)</span>
自定义中间件:
在项目目录下创建一个middleware包,然后在包中新建一个my_middleware.py文件如下:
1# my_middleware.py 2from django.utils.deprecation import MiddlewareMixin 3 4# 自定义类并继承MiddlewareMixin 5class Mi(middlewareMixin): 6 def process_request(self, request): 7 print('我来自Mi哈哈哈')
然后去settings.py中注册自定义的中间件
1# settings.py 2 3MIDDLEWARE = [ 4 'django.middleware.security.SecurityMiddleware', 5 'django.contrib.sessions.middleware.SessionMiddleware', 6 'django.middleware.common.CommonMiddleware', 7 'django.middleware.csrf.CsrfViewMiddleware', 8 'django.contrib.auth.middleware.AuthenticationMiddleware', 9 'django.contrib.messages.middleware.MessageMiddleware', 10 'django.middleware.clickjacking.XFrameOptionsMiddleware', 11 12 # 自定义的中间件 13 'middleware.my_middleware.Mi', 14]
五个可修改的内置方法:
1# 两个重点 2 3# process_request() 4""" 5请求来的时候会从上往下依次经过每一个中间里面process_request, 6一旦里面返回了HttpResponse对象那么就不再往后执行了, 7会执行同一级别的process_response 8""" 9def process_request(self, request): 10 print('我是process_request') 11 12# process_response() 13""" 14响应走的时候,会从下往上一次经过每一个中间件里面的porcess_response 15""" 16def process_response(self, request, response): 17 # response就是要返回给用户的数据 18 print('我是process_response') 19 return response 20 21 22# 三个了解 23# procesee_view(): 路由匹配成功之后执行视图函数之前触发 24# process_exception: 当视图函数出现异常的时候自动触发 25# process_template_response: 当视图函数执行完毕之后并且返回的对象中含有render方法的情况下才会触发