中间介(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…

容器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…

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、更新源…

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

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

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,…

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

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

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…

计算机中的字符编码

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

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

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

win10网速慢

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

android实用代码

Android实用代码七段&#xff08;一&#xff09; 前言 这里积累了一些不常见确又很实用的代码&#xff0c;每收集7条更新一次&#xff0c;希望能对大家有用。 声明 欢迎转载&#xff0c;但请保留文章原始出处:)     博客园&#xff1a;http://www.cnblogs.com 农民伯伯&…

VS2015 Cordova Ionic移动开发(五)

一、创建侧边菜单和导航项目 1.使用VS创建一个Ionic空项目&#xff0c;同时创建一个Ionic SideMenu和Ionic Tabs项目。将SideMenu和Tabs项目里的templates和js文件合并到空项目里&#xff0c;修改js对应的代码即可。完整项目工程如下&#xff1a; 2.App.js代码修改如下&#xf…

阿里大数据神预测 胜率仅5.9%中国却1:0胜韩国

写在最前面&#xff1a;这是早晨偶然看到的一篇文章&#xff0c;是对昨天中国却1&#xff1a;0胜韩国的评论。有朋友感慨&#xff1a;努力不放弃的时候&#xff0c;全世界都会帮你。这篇内容很全面的串起阿里巴巴在大数据预测方面的动作&#xff0c;角度很别致&#xff0c;分享…

Python中类、对象与self详解

先介绍一下python中的类与对象/实例。然后详细说明self。说明&#xff1a;对象等同实例&#xff0c;本文称呼不一致时请自行统一 【一】类与对象/实例 1、类 &#xff08;1&#xff09;类由名称、属性、方法三部分组成 &#xff08;2&#xff09;类是抽象模板&#xff0c;比如学…

java开发环境:还在配classpath?你out啦!

2019独角兽企业重金招聘Python工程师标准>>> 先说结论&#xff1a;只需要配置JAVA_HOME和path路径即可&#xff0c;无需配置classpath 参考Oracle官网的说明&#xff1a; The class path tells JDK tools and applications where to find third-party and user-defi…

.Net Core 商城微服务项目系列(二):使用Ocelot + Consul构建具备服务注册和发现功能的网关...

1.服务注册 在上一篇的鉴权和登录服务中分别通过NuGet引用Consul这个包&#xff0c;同时新增AppBuilderExtensions类&#xff1a; public static class AppBuilderExtensions{public static IApplicationBuilder RegisterConsul(this IApplicationBuilder app,IApplicationLife…

四参数坐标转换c++_GPSRTK坐标转换及四参数、七参数适用条件

工程测量仪器已由经纬仪、全站仪过渡到GNSS(全球卫星导航系统)&#xff0c;特别是公路行业&#xff0c;GPS-RTK作为GNSS的一种应用目前已十分普及。现阶段GPS-RTK以WGS-84 坐标系统为主流&#xff0c;所发布的星历参数也是基于此坐标系统&#xff0c;但随着北斗导航系统的逐步完…

java hadoop api_Hadoop 系列HDFS的Java API( Java API介绍)

HDFS的Java APIJava API介绍将详细介绍HDFS Java API&#xff0c;一下节再演示更多应用。Java API 官网如上图所示&#xff0c;Java API页面分为了三部分&#xff0c;左上角是包(Packages)窗口&#xff0c;左下角是所有类(All Classes是)窗口&#xff0c;右侧是详情窗口。这里推…

最大连通子数组

这次是求联通子数组的求和&#xff0c;我们想用图的某些算法&#xff0c;比如迪杰斯特拉等&#xff0c;但是遇到了困难。用BFS搜索能达到要求&#xff0c;但是还未能成功。 那么我们这样想&#xff0c;先将每行的最大子数组之和&#xff0c;然后再将这些最大之和组成一个数组&a…

[Matlab] 画图命令

matlab画图命令&#xff0c;不定时更新以便查找 set(gcf, color, [1 1 1]);     % 使图背景为白色 alpha(0.4);           %设置平面透明度 plot(Circle1,Circle2,k--,linewidth,1.25);  % k--设置线型  ‘linewidth’,1.25  设置线宽度为1.25 %线型   …