学习目标:
明确中间件的作用,了解中间件的原理,能够创建和使用中间件。学习内容:
1、 中间件的作用- 处理请求
- 处理响应
- 处理视图函数
- 处理异常
2、 中间件的原理
中间件实际上就是一群能够自动触发执行的函数集合。能够在用户请求与服务器端
的路由与视图函数之间建立一座桥梁。
3、 中间件的应用
- 在项目文件夹中创建一个目录(这里用Middle),
在目录中建立自己的中间件py文件(M1.py)
a. 导入创建中间件需要的模块MiddlewareMixin与自己需要的模块
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse
b. 定义自己的类(process_request,process_view,process_response,process_exception这几个函数名和参数与参数顺序不能改)
class M1(MiddlewareMixin):
def process_request(self,request):
print("请求1")
def process_view(self,request,view_func,view_func_args,view_func_kwargs):
print("处理view函数1",view_func_args)
print("处理view函数1",view_func_kwargs)
def process_response(self,request,response):
print("响应1")
return response
def process_exception(self,request,exception):
if isinstance(exception,ValueError):
return HttpResponse("异常处理1 ValueError!!!")
- 在settings.py文件中找到MIDDLEWARE并进行设置
a. 添加常规中间件
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',
]
b. 添加自定义中间件(添加的是路径)
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',
'Middle.M1.M1',
]
4、 中间件的运行规则
- 请求到来,依次执行列表中的中间件,遇到process_request函数就执行,
如果到某一个中间件的process_request函数直接返回响应response,
就直接原路返回依次执行process_response函数,不能到达目的地view函数。
- 如果执行最后一个中间件的process_request函数依然没有返回,
接下来就经过路由找到对应的view函数,但是不执行view函数,
而是跳转到中间件列表的开头位置,依次执行process_view函数,
直到最后一个,然后才能转到view函数并执行。
- 如果执行view函数出现错误异常,会按照中间件列表的反向顺序
依次执行process_exception函数,直到产生一个响应给process_response,
如果一直没有生成响应,就会报错。