1中间件
1.1 中间件作用
Django中的中间件是一个轻量级、底层的插件系统,可以介入Django的请求和响应处理过程,全局修改Django的输入或输出。
中间件的设计为开发者提供了一种无侵入式的开发方式,增强了Django框架的健壮性。
我们可以使用中间件,在Django处理视图的不同阶段对输入或输出进行干预。
因为改变的是全局,所以需要谨慎实用,用不好会影响到性能
1.2中间件执行顺序
如果你想修改请求,例如被传送到view中的**HttpRequest
对象。 或者你想修改view返回的HttpResponse
**对象,这些都可以通过中间件来实现。
可能你还想在view执行之前做一些操作,这种情况就可以用 middleware
来实现。
Django默认的中间件:(在django项目的settings模块中,有一个 MIDDLEWARE_CLASSES
变量,其中每一个元素就是一个中间件,如下图)
2 自定义中间件
2.1 钩子方法的种类
需要继承 django.utils.deprecation.MiddlewareMixin
这个类
可以重写的5个方法:
1、process_request(self,request) # django 处理请求之前,会执行该方法
2、process_view(self, request, callback, callback_args, callback_kwargs)
3、process_template_response(self,request,response)
4、process_exception(self, request, exception)
5、process_response(self, request, response) # django返回响应之后,执行该方法
以上方法的返回值可以是None
或一个HttpResponse
对象,如果是None
,则继续按照django定义的规则向后继续执行,如果是HttpResponse
对象,则直接将该对象返回给用户。
2.2自定义中间件
在app文件夹内创建一个middleware.py文件,在里边写上代码如下
这是课件上的代码 表明了五种钩子方法的使用
def process_request(self, request):
"""
处理请求前: 在每个请求上,request对象产生之后,url匹配之前调用,返回None或HttpResponse对象
"""
print('before request=====', request)
def process_view(self, request, view_func, *view_args, **view_kwargs):
"""
:param view_func: Django即将使用的视图函数,它是实际的函数对象,而不是函数的名称作为字符串
:param view_args: 将传递给视图的位置参数的列表
:param view_kwargs: 将传递给视图的关键字参数的字典;
view_args和view_kwargs都不包含第一个视图参数(request)
"""
# 处理视图前:在每个请求上,url匹配之后,视图函数调用之前调用,返回None或HttpResponse对象
print('before view=======')
def process_template_response(self, request, response):
# 在视图函数执行完后立即执行的, 执行 该 函数有一个前提条件,那就是视图函数返回的对象是一个 TemplateResponse 对象或等价方法, 直接返回render函数无效)
print("render template=======")
return response
def process_exception(self, request, exception):
# 这个方法只有在视图函数中出现异常了才执行,它返回的值可以是一个None也可以是一个HttpResponse对象
print("raise exception=======")
return HttpResponse(exception)
def process_response(self, request, response):
# 处理响应后:视图函数调用之后,所有响应返回浏览器之前被调用,在每个请求上调用,返回HttpResponse对象
print('after response>>>>>', response)
return response
这是自己自定义实现的
from django.utils.deprecation import MiddlewareMixin
class MyMiddleware(MiddlewareMixin):
#处理请求之前 调用这个中间件
def process_request(self,request):
print(f'process_request==={request}')
#视图返回之后,调用这个中间件
def process_response(self,request,response):
print(f'process_response==={request}')
return response #必须返回响应
2.3注册中间件
在跟项目同名文件夹里的settings.py里注册
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',
'myapp.middleware.MyMiddleware', #调用自定义中间件
]