对django中间件的理解
1. 什么是中间件(Django)?
对Django而言,中间件就是继承自MiddlewareMixin(位于django.utils.deprecation模块下)的类,该类对请求(request)及响应(response)的过程按照规则执行相应的控制方法,达到访问控制,权限管理,请求认证,数据缓存等等效果。
在django2.x中,项目会默认开启以下中间件,通过查看这些中间件的源码可以得知,
基本上这些内置中间件都重写了基类的process_request(request, *args, **kwargs)以及process_response(request, response *args, **kwargs)方法,
中间件(CsrfViewMiddleware等)重写了process_view(self, request, callback, callback_args, callback_kwargs)
视图(views)执行过程中的错误处理则是通过process_exception(self, request, exception)来控制。

2. 中间件所涉及的四种方法
process_request(request, *args, **kwargs)
process_view(self, request, callback, callback_args, callback_kwargs)
process_response(request, response *args, **kwargs) ------process_template_response(self,request,response)
process_exception(self, request, exception)
3. 中间件方法的执行顺序

3. 自定义中间件并测试其执行流程
我们在项目目录(与settings.py同级)下创建middleware包, 并新建test模块其内容如下:
from django.utils.deprecation import MiddlewareMixin
class ProcessMiddleware1(MiddlewareMixin):
def __str__(self):
return 'middleware 1'
def process_request(self, request):
print('%s:\t [%s]' % (self.__str__(), 'process_request'))
def process_view(self, *args):
print('%s:\t [%s]' % (self.__str__(), 'process_view'))
def process_response(self, request, response):
print('%s:\t [%s]' % (self.__str__(), 'process_response'))
return response
class ProcessMiddleware2(MiddlewareMixin):
def __str__(self):
return 'middleware 2'
def process_request(self, request):
print('%s:\t [%s]' % (self.__str__(), 'process_request'))
def process_view(self, *args):
print('%s:\t [%s]' % (self.__str__(), 'process_view'))
def process_response(self, request, response):
print('%s:\t [%s]' % (self.__str__(), 'process_response'))
return response
class ProcessMiddleware3(MiddlewareMixin):
def __str__(self):
return 'middleware 3'
def process_request(self, request):
print('%s:\t [%s]' % (self.__str__(), 'process_request'))
def process_view(self, *args):
print('%s:\t [%s]' % (self.__str__(), 'process_view'))
def process_response(self, request, response):
print('%s:\t [%s]' % (self.__str__(), 'process_response'))
return response
运行结果:

对django中间件的理解的更多相关文章
- Django学习之七:Django 中间件
目录 Django 中间件 自定义中间件 - - - 大体两种方式 将中间件移除 实例 中间件加载源码阅读 总结 Django 中间件 Tips: 更新日志: 2019.01.31 更新django中 ...
- Python菜鸟之路:Django 中间件
前言 在正式说Django中间件之前需要先了解Django一个完整的request的处理流程.我从其他网站扒了几张图过来. 图片一: 文字流程说明:如图所示,一个 HTTP 请求,首先被转化成一个 H ...
- django CBV装饰器 自定义django中间件 csrf跨站请求伪造 auth认证模块
CBV加装饰器 第一种 @method_decorator(装饰器) 加在get上 第二种 @method_decorator(login_auth,name='get') 加在类上 第三种 @met ...
- Django中间件,CSRF(跨站请求伪造),缓存,信号,BootStrap(模板)-响应式(栅格)+模板
Django中间件,CSRF(跨站请求伪造),缓存,信号,BootStrap(模板)-响应式(栅格)+模板 1.中间件(重要): 在Django的setting中有个MIDDLEWARE列表,里面的东 ...
- Django中间件-跨站请求伪造-django请求生命周期-Auth模块-seettings实现可插拔配置(设计思想)
Django中间件 一.什么是中间件 django中间件就是类似于django的保安;请求来的时候需要先经过中间件,才能到达django后端(url,views,models,templates), ...
- django中间件介绍
在学习django中间件之前,先来认识一下django的生命周期,如下图所示: django生命周期:浏览器发送的请求会先经过wsgiref模块处理解析出request(请求数据)给到中间件,然后通过 ...
- Django数据操作F和Q、model多对多操作、Django中间件、信号、读数据库里的数据实现分页
models.tb.objects.all().using('default'),根据using来指定在哪个库里查询,default是settings中配置的数据库的连接名称. 外话:django中引 ...
- django 中间件
django处理一个Request的过程是首先通过django 中间件,然后再通过默认的URL方式进行的.所以说我们要做的就是在django 中间件这个地方把所有Request拦截住,用我们自己的方式 ...
- day20 FORM补充(随时更新),F/Q操作,model之多对多,django中间件,缓存,信号
python-day20 1.FROM生成select标签的数据应该来源于数据库. 2.model 操作 F/Q (组合查询) 3.model 多对多操作. 4.中间件 :在请求到达url前先会经过 ...
随机推荐
- bzoj 3624: [Apio2008]免费道路【生成树+贪心】
先把水泥路建生成树,然后加鹅卵石路,这里加的鹅卵石路是一定要用的(连接各个联通块),然后初始化并查集,先把必需的鹅卵石路加进去,然后随便加鹅卵石路直到k条,然后加水泥路即可. 注意判断无解 #incl ...
- 【原创】《从0开始学RocketMQ》—集群搭建
用两台服务器,搭建出一个双master双slave.无单点故障的高可用 RocketMQ 集群.此处假设两台服务器的物理 IP 分别为:192.168.50.1.192.168.50.2. 内容目录 ...
- 程序3-3 Palindromes
刘大婶说这个比较难,哈哈,我感觉自己写的代码还是比较简单的. #include<stdio.h> #include<string.h> #include<math.h&g ...
- 尺取法 POJ 3320 Jessica's Reading Problem
题目传送门 /* 尺取法:先求出不同知识点的总个数tot,然后以获得知识点的个数作为界限, 更新最小值 */ #include <cstdio> #include <cmath> ...
- win10系统下使用EDGE浏览器找不到Report Builder 启动图标
Win10系统下如果要使用Report Builder,可能存在EDGE浏览器或者Chrome找不到ReportBuilder的启动图标的情况,此时,应以管理员权限运行IE浏览器,即可看到图标.
- Java中的流(2)字节流-InputStream和OutputStream
字节流的两个顶层类是抽象类:InputStream和OutputStream 1. OutputStream void write(int b) 往流中写一个字节b void write(byte b ...
- 转-iOS 动画总结----UIView动画
来自:http://blog.csdn.net/huifeidexin_1/article/details/7597868/ 1.概述 UIKit直接将动画集成到UIView类中,实现简单动画的创建过 ...
- Spring Cloud是什么?
[学习笔记] 3)Spring Cloud是什么?马克-to-win@马克java社区:i)Spring Cloud是一个微服务框架,Spring Cloud基于微服务基础框架Netflix进行了up ...
- mac重启iterm后不会自动加载.bash_profile
我用的zsh,由于平时设置的环境变量都是在.bash_profile文件中,每次重启iterm后,都需要重启手动加载.bash_profile文件,很麻烦. 设置自动加载.bash_profile的方 ...
- nodejs idea 创建项目 (一)
1.在工作空间创建module file->new module next next 项目的目录结构: bin:跟业务无关的公共部分 node_modules :默认的模块 public:公共模 ...