1.what is 中间件?
- 是一个Python类,用来在全局范围内处理请求和响应的一个钩子.
- 它是一个轻量低级别的插件系统,用于在全局范围内改变Django的输入出。每个中间件组件都负责做一些特定的功能。
- 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', ]
2.自定义组件
- django中自带的自定义组件:
-
from django.utils.deprecation import MiddlewareMixin class CsrfViewMiddleware(MiddlewareMixin): def process_request(self, request): csrf_token = self._get_token(request) if csrf_token is not None: # Use same token next time. request.META['CSRF_COOKIE'] = csrf_token
- 然后在django的配置文件settings中把上面的文件的路径添加到MIDDLEWARE中即可:
-
settings 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', 'app01.middleC.Login' ]
- diango的中间件就是定义一个类,继承MiddlewareMixin类,这个类中有五个方法;分别给出他们什么时间执行,执行顺序,返回值:
- process_request:
-
1.执行时间:在视图函数views执行之前 2.参数:request -->跟视图函数一致,都是一个对象,可以对其封装属性 3.执行顺序:多个中间件时,按照注册顺序执行, 4.返回值: None:正常流程,依次往下走; return response对象,会直接从这结束,视图函数也不会执行,开始返回给浏览器一个response对象;
当前中间件之后的中间件的request方法都不执行;所以也没有response方法; - process_response:
-
执行时间:在views函数之后调用, 参数:(request,response) 返回值:这里因为是在views函数之后调用,所以要接收一个response对象要返回; 执行顺序:对个中间件时,按注册顺序倒序执行,
- process_view:
-
执行时间:在request之后,正则匹配执行views之前; 参数:(request, callback, callback_args, callback_kwargs) callback:是正则匹配后的调用函数, callback_args, callback_kwargs:是该函数的参数; 顺序:按注册顺序正序执行; 返回值: None:正常走; response对象:上面的的views方法中如果有return HttpResponse,就停止执行下一个中间件的views方法,
但是不干扰其他request或者response方法; - process_exception(self, request, exception):
-
执行时间:有异常才会触发;在views执行之后,response之前; 参数:(self, request, exception):exception是错误信息对象; 执行顺序:按照注册顺序倒序; 返回值:跟process_view方法一样,
- process_template_response(self,request,response):
-
执行时间:触发事件(views函数中的response对象有render方法),在视图函数之后,在process_response之前; 执行顺序:倒序执行 返回值:返回response,在views里的函数也要有返回response对象;
-
def index(request): print('这是index的方法') ret = HttpResponse('ok') def fn(): print('') return ret 或则 httpresponse('ok') ret.render = fn return ret