django中间件及中间件实现的登录验证 1.定义
一个用来处理Django的请求和响应的框架级别的钩子(函数),相对比较轻量级,并且在全局上改变django的输入与输出(使用需谨慎,否则影响性能)
直白的说中间件就是帮助我们在视图函数执行之前和执行之后做一些额外操作
2.用处用户登录
日志记录
权限管理
请求验证(post)
一般对所有请求做批量处理的时候用中间件,单独对某几个函数处理直接使用装饰器
3.用法说明我们使用django一直就在使用中间件,打开django的setting文件,当中的MIDDLEWARE配置项
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\', ]列表当中的每个字符串,其实是一个个类,即一个个中间件,它们正常的执行顺序都是自上而下的
中间件中,我们可以定义五个方法,分别是:
process_request(``self``,request)``process_view(``self``, request, view_func, view_args, view_kwargs)``process_template_response(``self``,request,response)``process_exception(``self``, request, exception)``process_response(``self``, request, response)其中最常用的是process_request和process_response
以上方法的返回值可以是None或一个HttpResponse对象,如果是None,则继续按照django定义的规则向后继续执行,如果是HttpResponse对象,则直接将该对象返回给用户。
3.1 图例说明这里还是先来看看django的生命周期图例
先从上图了解django执行流程,每一步起了那些关键性作用,然后我们再来讨论每一个中间件
3.2 process_request与process_responseprocess_request有一个request参数,这个和视图函数中的request参数一模一样
process_response有两个参数,一个是request,一个是response,request和前面一致,response是视图函数返回的HttpResponse对象
代码实例
我在应用下创建了一个middlewares文件,用于存放中间件
from django.utils.deprecation import MiddlewareMixin # 注意导入路径 class MD1(MiddlewareMixin): def process_request(self, request): print(\'我是MD1的process_request\') def process_response(self, request, response): print(\'我是MD1的process_response\') return response class MD2(MiddlewareMixin): def process_request(self, request): print(\'我是MD2的process_request\') def process_response(self, request, response): print(\'我是MD2的process_response\') return responsesetting.py文件配制添加的中间价位置
访问一个视图,终端输出结果:
总结:
1.process_request方法,是在视图函数执行之前执行的,当配制多个中间件时,会按照MIDDLEWARE中的注册顺序,也就是列表的索引值,从前到后依次执行的
返回值是None,继续往后执行,返回值是HttpResponse的对象,执行对应中间件的process_response方法
2.对于视图函数,是在process_request执行完毕后开始执行的
3.process_response方法,是在视图函数之后执行的,而且多个中间件中的process_response方法是按照MIDDLEWARE中的注册顺序倒序执行的
3.3 process_viewprocess_view(self, request, view_func, view_args, view_kwargs)
该方法有四个参数:
request是HttpRequest对象。
view_func是Django即将使用的视图函数。 (它是实际的函数对象,而不是函数的名称作为字符串。)
view_args是将传递给视图的位置参数的列表.
view_kwargs是将传递给视图的关键字参数的字典。 view_args和view_kwargs都不包含第一个视图参数(request)。
代码实例
from django.utils.deprecation import MiddlewareMixin from django.shortcuts import render, redirect, HttpResponse class MD1(MiddlewareMixin): def process_request(self, request): print(\'我是MD1的process_request\') def process_response(self, request, response): print(\'我是MD1的process_response\') return response def process_view(self, request, view_func, view_args, view_kwargs): print(\'我是MD1的process_view\') print(view_func, view_func.__name__)class MD2(MiddlewareMixin): def process_request(self, request): print(\'我是MD2的process_request\') # return HttpResponse(\'MD2process_request\') def process_response(self, request, response): print(\'我是MD2的process_response\') return response def process_view(self, request, view_func, view_args, view_kwargs): print(\'我是MD2的process_view\') print(view_func, view_func.__name__)效果