##Django中间件看完这篇彻底明白

我们在使用python的一些库时 , 会遇到中间件这个概念 , 比如scrapy和Django , 那么什么是中间件呢?什么是中间件
中间件就是在目标和结果之间进行的额外处理过程 , 在Django中就是request和response之间进行的处理 , 相对来说实现起来比较简单 , 但是要注意它是对全局有效的 , 可以在全局范围内改变输入和输出结果 , 因此需要谨慎使用 , 否则不仅会造成难以定位的错误 , 而且可能会影响整体性能 。中间件有什么用
如果想要修改HttpRequest或者HttpResponse , 就可以通过中间件来实现 。
登陆认证:在中间件中加入登陆认证 , 所有请求就自动拥有登陆认证 , 如果需要放开部分路由 , 只需要特殊处理就可以了 。
流量统计:可以针对一些渲染页面统计访问流量 。
恶意请求拦截:统计IP请求次数 , 可以进行频次限制或者封禁IP 。中间件执行流程
在Django中自定义中间件是非常简单的 , 在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', ]
只要把添加的中间件配置在这里就可以了 。每一个中间件都是一个类 , 多个中间件可以写在同一个文件 , 也可以在独立文件中 。每个中间件可以包含五个方法:process_request(self,request) process_view(self,request,callback,callback_args,callback_kwargs) process_template_response(self,request,response) process_exception(self,request,exception) process_response(self,request,response)
我在网上找到这么一张图片 , 说明了请求的数据流在Django中间件当中的执行流程
##Django中间件看完这篇彻底明白
文章图片

文章图片

中间件函数执行流程
请求到达中间件后先依次执行每个中间件的process_request函数
【##Django中间件看完这篇彻底明白】然后再依次执行每个中间件的process_view函数 , 找到我们的视图函数
执行视图函数处理请求数据
如果在上面的过程中出现异常 , 则依次反方向执行每个中间件的process_exception函数
如果请求包含模板渲染 , 则依次反方向执行每个中间件的process_template_response函数
最后依次反方向执行每个中间件的process_response函数
以上这些执行函数将返回None或者HttpResponse对象 , 如果返回None , 则交给下一个中间件的对应函数处理;如果返回HttpResponse对象 , 则将其返回给用户
在这些中间件的执行函数中 , 我们最常用的就是process_request和process_response函数 , 通常用来在视图函数处理前和视图函数处理后执行一些相应的操作 , 这个要根据我们的业务需求 , 选择不同的处理过程 。例如:进行登陆认证 , 因为必须要在视图函数处理前进行认证 , 我们可以在process_request中处理;携带认证cookies信息 , 就可以在process_response函数中给response对象增加指定cookies值 。中间件回调函数执行
Request函数:process_request(self, request)
执行时机:当接收到前端请求 , 并生成request对象 , 但是仍未解析url , 未确定当前要运行的视图函数 。
如果返回None , Django将继续处理下一个中间件的request函数;如果返回HttpResponse对象 , Django将不再执行其他除process_response以外的所有函数 , 包括后面的process_request函数、其他中间件函数以及视图函数 。


推荐阅读