引子-Django的生命周期

在学习中间介之前,我们先来回顾一下Django的生命周期:用户发起请求,请求会被发送到urlconf中的url,然后会指向对应的views函数进行处理,views函数处理完成后,用模板渲染好html,然后返回给用户的浏览器。

加上中间介的流程如下:

在Django中的setttings文件有配置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',
]

执行顺序从上到下。

自定义中间介

1、自定义中间介

新建一个名为middle的包,下面新建文件md.py,

内容如下:

from django.utils.deprecation import MiddlewareMixinclass MD1(MiddlewareMixin):def process_request(self,request):print "MD1 process_request"def process_response(self,request,response):print "MD1 process_response"return responseclass MD2(MiddlewareMixin):def process_request(self,request):print "MD2 process_request"def process_response(self,request,response):print "MD2 process_response"print responsereturn response

  

2、setttings文件配置

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','middle.md1.MD1','middle.md1.MD2',
]

  

3、视图函数

views.py

def md(request):print "views function"return HttpResponse('execute view function')

  

4、urls.py文件

urlpatterns = [url(r'^admin/', admin.site.urls),url(r'^index/', views.index),url(r'^mf/', views.mf),url(r'^fm/', views.fm),url(r'^myform/', views.myform),url(r'md',views.md),]

 

5、访问URL

浏览器返回视图函数的内容:

后台执行:

中间介依次执行,

MD1的process_request,MD2的process_request
MD2的process_response,MD1的process_response

中间介的response值为视图函数的返回值。

 

class MD1(MiddlewareMixin):def process_request(self,request):print "MD1 process_request"        #process_request函数有返回值时,会直接返回给用户,而不往下执行。return HttpResponse('MD1 process_request')def process_response(self,request,response):print "MD1 process_response"return response

  

执行结果为:

多个middleware的整体执行流程如下:

MiddlewareMixin函数

源码

class MiddlewareMixin(object):#构造函数执行父类的构造函数def __init__(self, get_response=None):self.get_response = get_responsesuper(MiddlewareMixin, self).__init__()def __call__(self, request):response = None#如果当前中间介有process_request方法,则执行if hasattr(self, 'process_request'):response = self.process_request(request)#如果当前中间介没有process_request方法,则执行下一个中间介的__call__(),依次循环执行下去if not response:response = self.get_response(request)#执行当前中间介的process_reponse方法if hasattr(self, 'process_response'):response = self.process_response(request, response)return response

  7、8、9版本里面process_request和process_response方法都是必须写的,10版本以后可以不写,但是为了过渡,最好写上。

每个中间介,可能只有process_request,也可能只有process_response方法。

总结

中间介整体执行流程

中间介应用场景

对于所有的用户统一的请求都需要处理,这时就需要中间介可以搞定,如果是部分用户请求,可以用装饰器进行处理。

csrf是通过判断request的header里面是否有csrf参数。

最常用的方法

process_request

因为process_request方法可以在用户请求时,做统一的操作非常方便、灵活,比如设置白名单。

转载于:https://www.cnblogs.com/skyflask/p/9823498.html

中间介(MiddleWare)相关推荐

  1. 弹性网络_理论物理所建立解析模型研究凝胶网络弹性介导的液液相分离现象

    细胞为了调控其内部复杂的生化反应,需要具有两个重要性质的细胞隔室--有一个边界用于隔离外界环境(细胞质).内部物质可自由扩散.一些隔室通过细胞膜与外界隔开,然而有些隔室是无膜的(如核仁等).理解无膜隔 ...

  2. Error: Most middleware (like bodyParser) ...

    运行NodeJS时出现如下错误: Error: Most middleware (like bodyParser) is no longer bundled with Express and must ...

  3. Gin源码解析和例子——中间件(middleware)

    在<Gin源码解析和例子--路由>一文中,我们已经初识中间件.本文将继续探讨这个技术.(转载请指明出于breaksoftware的csdn博客) Gin的中间件,本质是一个匿名回调函数.这 ...

  4. ISME:广东土壤所孙蔚旻组-脱硫弧菌介导的硫氧化锑还原耦合作用

    ‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍ 第一作者:孙晓旭 通讯作者:孙蔚旻 通讯单位:广东省科学院生态环境与土壤研究所 发表时间:2022.02.07 论文DOI:10.1 ...

  5. SBIO | 许金荣/江聪团队报道禾谷镰刀菌MAPKs介导的生长发育、逆境响应及生物互作机制...

    点击蓝字|关注我们 导读 丝裂原活化蛋白激酶(MAPK)信号途径普遍存在于真核生物中.MAPK在激活后会磷酸化不同的底物蛋白,诱导生物体对外源或内源刺激做出应答反应,从而在生长发育以及抗逆过程中发挥重 ...

  6. STE:华南农大曾振灵/熊文广-猪粪介导抗生素耐药基因向农场工人和周边环境传播...

    猪粪介导抗生素耐药基因向农场工人和周边环境传播 近日,华南农业大学兽医学院曾振灵教授课题组在著名期刊<Science of The Total Environment>(JCR一区,IF ...

  7. Cell子刊:粘上你-细菌生长素介导的植物根部细菌定殖

    粘上你:细菌生长素介导的植物根部细菌定殖 Stuck on you: Bacterial-auxin-mediated bacterial colonization of plant roots Ce ...

  8. ISME:南土所梁玉婷组-不同气候条件下微生物代谢及残体介导施肥对土壤有机碳的影响...

    不同气候条件下微生物代谢及残体介导施肥对土壤有机碳的影响 Microbial metabolism and necromass mediated fertilization effect on soi ...

  9. Microbiome | 中科院张惠明团队揭示RNA介导的DNA甲基化影响植物根部微生物群落!...

    研究背景 植物在根际中拥有多种土壤微生物,有机化合物从根部释放到土壤中,从而为土壤微生物提供了营养丰富的环境.根际微生物能够以不同的方式影响植物,例如通过产生刺激植物生长的植物激素或引起植物病害症状的 ...

最新文章

  1. largest number java_将给定的数组组成最大的数 Largest Number
  2. ADO.NET笔记——带参数的查询防止SQL注入攻击
  3. 函数计算自动化运维实战 3 -- 事件触发自动创建快照
  4. 基于Docker本地运行k8s(单节点)
  5. 中运量71路线路图_双语导乘对标“航空式服务”,71路中运量车队服务进博会出“新招”...
  6. pythoncharm下载cpython失败_pycharm虚拟环境下安装mysqlclient失败
  7. 详解链表在前端的应用,顺便再弄懂原型和原型链!
  8. matlab 二维高斯滤波 傅里叶_机器视觉 03.2 频域低通滤波
  9. Spring Boot 2 快速教程:WebFlux 集成 Mongodb(四)
  10. 利用PowerDesigner15在win7系统下对MySQL 进行反向project(二)
  11. JSP中调用存储过程(SQL2000)
  12. java ajax cookies_HttpOnly cookie如何处理AJAX请求?
  13. 拓端tecdat|R语言逻辑回归和泊松回归模型对发生交通事故概率建模
  14. 怎么把python从c盘移到d盘_如何转移Pycharm的设置或者缓存到其他盘
  15. 计算机vb小游戏,vb6做的游戏,用vb做简单小游戏代码,vb小游戏程序代码,vb游戏,vb怎么编写,vb有什么用:小游戏vb【VB编写小游戏】-南开游戏网...
  16. vue实现div高度可拖拽
  17. PythonSD01个人释疑
  18. 秒懂!什么是BI商业智能!
  19. Nagios:用门户邮箱+mailx+139邮箱实现实时短信报警
  20. BUG日志:无法解析的外部符号 _Direct3DCreate9

热门文章

  1. linux epoll机制对TCP 客户端和服务端的监听C代码通用框架实现
  2. Appium——主从控制执行
  3. ImageLoader加载图片
  4. MySQL(五) —— 子查询
  5. Canvas createImageData
  6. 完整的Android 新浪微博api调用DEMO
  7. sharepoint配置问题解决方案
  8. ASP.NET N问N答 (一) ASP.NET怎么导出到WORD?(把girdview里面的数据到出到word)
  9. GC 调优(实战篇) - GC参考手册
  10. 为数据计算提供强力引擎,阿里云文件存储HDFS v1.0公测发布