浅谈django中间件小知识

下面这幅图是我从网上随便扒了一幅图,主要让读者能够大致知道django请求的生命周期。

下面这幅图主要用来说明从客户端请求进来到中间件之后的一个先后顺序以及一些原理性的东西,这里不做django基础知识点的说明,可能会涉及到源码。

下面直接动手来回答这些问题

问题1:关于process_request和process_response处理请求的先后顺序(process_request可以理解为是用户请求进来的时候中间件会做些什么。而process_response的作用主要是给用户最终将处理好的数据经过中间件返回给用户)

话不多少直接准备一个例子做下测试,我这里写了三个中间件,并且都已经注册过了,下面是测试准备的代码。

from django.utils.deprecation import MiddlewareMixinclass Md1(MiddlewareMixin):def process_request(self,request):print("md1来了")def process_response(self,request,response):print("md1走了")return responseclass Md2(MiddlewareMixin):def process_request(self,request):print("md2来了")def process_response(self,request,response):print("md2走了")return responseclass Md3(MiddlewareMixin):def process_request(self,request):print("md3来了")def process_response(self,request,response):print("md3走了")return response

我们看一下返回结果

从上面看我们知道执行的结果是 请求进来的时候是正序,请求出去的时候则会是倒序。

问题2:如果我在其中一个中间件请求的时候返回了response,那会如何呢?请求流程还会走完吗?

从上面的图中我们可以看到我们在md2中的process_request直接return了HttpResponse,结果路由没经过md3就直接给返回出去了。

问题3:借着问题2我们再来想一个问题?看上图,我的url不是指向了home/吗?为啥HttpreSponse直接给返回到这里了?难道他中间件的执行在路由之前?

好说分别在中间件process_request打印一下request.resolver_match看一下返回信息不就行了吗?

ok,添加完成之后我们来测试一下,看一下返回值。

那也就证实了问题2上的问题,在middleware之前是没有路由匹配的。

三者的区别和作用也就如上图一样,一目了然,例如如果给用户权限做些判断,那么就可以在process_request的时候做,路由分发之后需要对视图做处理,那就用process_view,如果需要给用户的返回信息做处理,那就用process_response.

问题4 如果process_view做了return那会如何?和问题2的结果会一样吗?

为了方便大家测试和理解,我把中间件这部分的代码贴到下面

from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import render,HttpResponseclass Md1(MiddlewareMixin):def process_request(self,request):print("md1来了")#print(request.resolver_match)def process_view(self,request,view_func,view_agrs,view_kwargs):print("view1来了")return HttpResponse("我被view1给return了")def process_response(self,request,response):print("md1走了")return responseclass Md2(MiddlewareMixin):def process_request(self,request):print("md2来了")#return HttpResponse("因为权限不够啦,所以我得走了")def process_view(self,request,view_func,view_agrs,view_kwargs):print("view2来了")def process_response(self,request,response):print("md2走了")return responseclass Md3(MiddlewareMixin):def process_request(self,request):print("md3来了")def process_view(self,request,view_func,view_agrs,view_kwargs):print("view3来了")def process_response(self,request,response):print("md3走了")return response

我们可以看到当process_view被return的时候,那就会递给process_response,当然,这里不是给md1的process_response,而是给了md3.

django中间件小知识相关推荐

  1. 利用django中间件CsrfViewMiddleware防止csrf攻击

    一.在django后台处理 1.将django的setting中的加入django.contrib.messages.middleware.MessageMiddleware,一般新建的django项 ...

  2. 实习笔记0708 https协议/ django中间件/接口测试/内网与外网/域名系统DNS

    1 https协议 https://www.cnblogs.com/superfeeling/p/11561340.html https://www.cnblogs.com/an-wen/p/1118 ...

  3. Python 之 Django框架( Cookie和Session、Django中间件、AJAX、Django序列化)

    12.4 Cookie和Session 12.41 cookie Cookie具体指的是一段小信息,它是服务器发送出来存储在浏览器上的一组组键值对,下次访问服务器时浏览器会自动携带这些键值对,以便服务 ...

  4. Django实现小程序的登录验证功能,并维护登录态

    说明 这次自己做了一个小程序来玩,在登录方面一直有些模糊,网上看了很多文档后,得出以下一种解决方案. 环境说明: 1.小程序只需要拿到openid,其他信息不存储. 2.Django自带的User类不 ...

  5. android小知识(1)

    1.Android名称的由来. 大家可能不知道,Android一词的本义原指"机器人",它也是谷歌于2007年11月5日宣布的基于Linux平台的开源手机操作系统的名称,该平台由操 ...

  6. Django 中间件(middleware)的工作原理和应用场景举例

    在初级Django开发项目中,你大概率用不到中间件(Middleware).但随着项目需求越来越复杂,你就需要开始编写自己的中间件了.当你了解到Django中间件(middleware)的工作原理和作 ...

  7. python middleware模块_详解利用django中间件django.middleware.csrf.CsrfViewMiddleware防止csrf攻击...

    一.在django后台处理 1.将django的setting中的加入django.contrib.messages.middleware.MessageMiddleware,一般新建的django项 ...

  8. 网络安全你必须知道的100个小知识

    网络安全风险无处不在,信服君为大家梳理了100个网络安全相关的小知识,希望能进一步提升大家的安全意识,帮助大家建立更加安全的网络环境.       网络安全入门学习路线 其实入门网络安全要学的东西不算 ...

  9. 【C#小知识】C#中一些易混淆概念总结(三)---------结构,GC,静态成员,静态类...

    目录: [C#小知识]C#中一些易混淆概念总结 [C#小知识]C#中一些易混淆概念总结(二) ---------------------------------------分割线----------- ...

最新文章

  1. NLP任务语义相似数据准备及实战
  2. MVC POST请求后执行javascript代码
  3. SQL触发器demo
  4. 火焰效果材质实现_「游戏开发」使用Unity实现魔法火焰效果
  5. python实现微信小程序的接口自动化_appium+python自动化56-微信小程序自动化(摩拜为例)...
  6. [css] 外边距重叠是什么?重叠的结果是什么?怎么防止外边距重叠?
  7. element 修改表单值后表单验证无效_element 表单自定义校验规则
  8. Pannellum:实例之自动加载全景图
  9. laravel常用拓展库
  10. 22轴三菱Q系列程序案例点胶机,QJ71C24串口与位移传感器通信案例
  11. LPDDR4学习笔记
  12. vue.jsv-if 的key值问题
  13. 鸿蒙设备开发者门户,鸿蒙系统在华为开发者大会上正式亮相
  14. Java工程师必备技能有哪些?
  15. Vue directives 自定义局部指令中调用 method 中的方法
  16. vue中 aria-label 的使用
  17. JavaEE进阶——全文检索之Lucene框架
  18. SMDS:交换式多兆位数据服务--网络大典
  19. RHCE环境准备 | 介绍
  20. 北京大学软微第二学位可能被取消!高校第二学士学位将成历史!

热门文章

  1. 【问题】yocto学习:ERROR: Execution of event handler ‘sstate_eventhandler2‘ failed
  2. Altium Designer(AD)> 导入logo图片
  3. 转载: 8天学通MongoDB——第六天 分片技术
  4. 数据库连接池并发的实现原理
  5. isomorphic graphs 图同构
  6. java中有那三种技术平台_Java语言有三种技术平台,分别是JavaSE、JavaME、JavaEE()...
  7. mysql 正则表达式数字_MYSQL使用正则表达式过滤数据
  8. vue过渡动画Animate.css动画库(1)
  9. 量子领域的机器学习人工智能(三)(Machine learning artificial intelligence in the quantum domain)
  10. pg创建索引以及删除索引的语法