中间介(MiddleWare)

 引子-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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/396434.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

对MariaDB10.0的Sphinx进行扩展

已修改过的文件:http://pan.baidu.com/s/1o8DHvkA 将这两个文件放到MariaDB的解压目录后,再进行安装 /usr/local/mariadb-10.0.28/storage/sphinx/ 如下是修改的代码 get_rec ( byte * buf, const byte * key, uint keylen,uint a,uint b,uint c );index…

C++常用特性原理解析

在我的早期印象中,C这门语言是软件工程发展过程中,出于对面向对象语言级支持不可或缺的情况下,一群曾经信誓旦旦想要用C统治宇宙的极客们妥协出来的一个高性能怪咖。 它驳杂万分,但引人入胜,出于多(mian)种(shi)原因&a…

容器created状态_docker容器状态的转换实现

一 docker容器状态转换图二 实战[rootlocalhost ~]# docker infoContainers: 0Running: 0Paused: 0Stopped: 0Images: 3Server Version: 17.09.0-ceStorage Driver: overlayBacking Filesystem: xfsSupports d_type: falseLogging Driver: json-fileCgroup Driver: cgroupfsPlu…

nodejs命令行执行程序_在NodeJS中编写命令行应用程序

nodejs命令行执行程序by Peter Benjamin彼得本杰明(Peter Benjamin) 在NodeJS中编写命令行应用程序 (Writing Command-Line Applications in NodeJS) With the right packages, writing command-line apps in NodeJS is a breeze.有了合适的软件包,用NodeJS编写命令…

python re findall 效率_python re模块findall()详解

今天写代码,在写到郑泽的时候遇到了一个坑,这个坑是re模块下的findall()函数。下面我将结合代码,记录一下importrestring"abcdefg acbdgef abcdgfe cadbgfe"#带括号与不带括号的区别#不带括号regexre.compile("((\w)\s\w)&quo…

ubuntu16.04配置sonarqube+MySQL

环境:rootubuntu:~# uname -a Linux ubuntu 4.4.0-21-generic #37-Ubuntu SMP Mon Apr 18 18:33:37 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux rootubuntu:~# rootubuntu:~# cat /etc/issue Ubuntu 16.04 LTS \n \lrootubuntu:~#安装配置mysql:1、更新源…

mysql 多表混全_mysql--浅谈多表查询1

这是对自己学习燕十八老师mysql教程的总结,非常感谢燕十八老师。依赖软件:mysql5.6系统环境:win连接查询在谈连接查询之前我们需要对数学上的笛卡尔积有一定的了解现在有两个集合m和nm (m1,m2,.....mx)n (n1,n2,.....ny)m*n得到的笛卡尔积有…

鼠标固定在屏幕中间_无线电竞黑科技,雷柏VT950Q游戏鼠标评测

雷柏作为目前小有声誉的PC外设品牌,其定位高性能游戏领域的VT系列产品,想必大家也比较熟悉了。VT系列的产品除了有超强的性能以及出色的设计感,同时还都是性价比非常高的产品,即便是采用了旗舰级传感器,定位最为高端的…

谈论源码_5,000名开发人员谈论他们的薪水

谈论源码Let’s dive into the most interesting results from the O’Reilly 2016 Salary Survey of 5,000 developers (which excluded managers and students).让我们来看看OReilly 2016年薪金调查对5,000名开发人员(其中不包括经理和学生)最有趣的结果。 性别工资差距是真…

WebSnapshotsHelper(HTML转换为图片)

1 /// <summary>2 /// WebBrowser Url生成图片3 /// HTML转图片4 /// </summary>5 public class WebSnapshotsHelper6 {7 Bitmap m_Bitmap;8 string m_Url;9 int m_BrowserWidth, m_BrowserHeight, m_ThumbnailWidth,…

两个多项式相乘求解系数数组算法

题目描述&#xff1a; 给出两个多项式&#xff0c;最高次幂分别为n和m&#xff0c;求解这两个系数相乘得到的系数数组。 分析&#xff1a; 最高次幂如果是m和n&#xff0c;那么他们相乘得到的系数数组的最高次幂一定是nm&#xff0c;对于其他的系数&#xff0c;不妨设a[],b[]是…

synchronized 和 reentrantlock 区别是什么_JUC源码系列之ReentrantLock源码解析

目录ReentrantLock 简介ReentrantLock 使用示例ReentrantLock 与 synchronized 的区别ReentrantLock 实现原理ReentrantLock 源码解析ReentrantLock 简介ReentrantLock 是 JDK 提供的一个可重入的独占锁&#xff0c;独占锁&#xff1a;同一时间只有一个线程可以持有锁可重入&am…

gulp 和npm_为什么我离开Gulp和Grunt去看npm脚本

gulp 和npmI know what you’re thinking. WAT?! Didn’t Gulp just kill Grunt? Why can’t we just be content for a few minutes here in JavaScript land? I hear ya, but…我知道你在想什么 WAT &#xff1f;&#xff01; 古尔普不是杀死了咕unt吗&#xff1f; 为什么…

mysql8.0递归_mysql8.0版本递归查询

1.先在mysql数据库添加数据DROP TABLE IF EXISTS dept;CREATE TABLE dept (id int(11) NOT NULL,pid int(11) DEFAULT NULL,name varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,date datetime(0) DEFAULT NULL,PRIMARY KEY (id) USING BTREE) ENGINE…

js 轮播插件

flexslider pc插件 个人用过flickerplate 移动端插件 个人用过个人觉得比较好的移动端插件swiper http://www.swiper.com.cn/ 用过个人觉得比较好的pc端插件待定

计算机中的字符编码

字符编码 什么是计算机编码 计算机只能处理二进制的数据&#xff0c;其它的数据都要进行转换&#xff0c;但转换必须要有一套字符编码(是字符与二进制的一个对应关系)。常用的字符&#xff1a;a-z、0-9、其它的符号等&#xff0c;计算机也不能直接处理。 &#xff08;字符编码类…

致力微商_致力于自己。 致力于公益组织。

致力微商by freeCodeCamp通过freeCodeCamp 致力于自己。 致力于公益组织。 (Commit to Yourself. Commit to a Nonprofit.) In case you missed it, our October Summit was jam-packed with several big announcements about our open source community.如果您错过了它&#…

应急照明市电检测_应急照明如何供电? 如何接线? 图文分析!

对于大部分刚接触建筑电气设计的工作者来说&#xff0c;应急照明的强启原理一直都是很头疼的问题。由于不知道应急照明的强启原理&#xff0c;所以&#xff0c;应急灯具应该用多少根线&#xff0c;其实也就无从谈起。下面以文字和图片结合的方式来说明应急灯怎么接线的&#xf…

win10网速慢

升级到win10之后发现网速特别慢&#xff0c;搜了下&#xff0c;网上的解决办法果然好使&#xff0c;按照如下操作即可。 返回桌面&#xff0c;按WINR键组合&#xff0c;运行gpedit.msc 打开组策略 依次展开管理模板-》网络-》QoS数据计划程序-》限制可保留宽带&#xff0c;双击…

ubuntu安装nodejs

下载nodejs https://nodejs.org/dist/v4.6.0/node-v4.6.0-linux-x64.tar.gz 解压 tar -zxvf node-v4.6.0-linux-x64.tar.gz 移动到/opt/下 mv node-v4.6.0-linux-x64 /opt/ 创建链接 ln -s /opt/node-v4.6.0-linux-x64/bin/node /usr/local/bin/node 转载于:https://www.cnblog…