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中间件的理解的更多相关文章

  1. Django学习之七:Django 中间件

    目录 Django 中间件 自定义中间件 - - - 大体两种方式 将中间件移除 实例 中间件加载源码阅读 总结 Django 中间件 Tips: 更新日志: 2019.01.31 更新django中 ...

  2. Python菜鸟之路:Django 中间件

    前言 在正式说Django中间件之前需要先了解Django一个完整的request的处理流程.我从其他网站扒了几张图过来. 图片一: 文字流程说明:如图所示,一个 HTTP 请求,首先被转化成一个 H ...

  3. django CBV装饰器 自定义django中间件 csrf跨站请求伪造 auth认证模块

    CBV加装饰器 第一种 @method_decorator(装饰器) 加在get上 第二种 @method_decorator(login_auth,name='get') 加在类上 第三种 @met ...

  4. Django中间件,CSRF(跨站请求伪造),缓存,信号,BootStrap(模板)-响应式(栅格)+模板

    Django中间件,CSRF(跨站请求伪造),缓存,信号,BootStrap(模板)-响应式(栅格)+模板 1.中间件(重要): 在Django的setting中有个MIDDLEWARE列表,里面的东 ...

  5. Django中间件-跨站请求伪造-django请求生命周期-Auth模块-seettings实现可插拔配置(设计思想)

    Django中间件 一.什么是中间件 django中间件就是类似于django的保安;请求来的时候需要先经过中间件,才能到达django后端(url,views,models,templates), ...

  6. django中间件介绍

    在学习django中间件之前,先来认识一下django的生命周期,如下图所示: django生命周期:浏览器发送的请求会先经过wsgiref模块处理解析出request(请求数据)给到中间件,然后通过 ...

  7. Django数据操作F和Q、model多对多操作、Django中间件、信号、读数据库里的数据实现分页

    models.tb.objects.all().using('default'),根据using来指定在哪个库里查询,default是settings中配置的数据库的连接名称. 外话:django中引 ...

  8. django 中间件

    django处理一个Request的过程是首先通过django 中间件,然后再通过默认的URL方式进行的.所以说我们要做的就是在django 中间件这个地方把所有Request拦截住,用我们自己的方式 ...

  9. day20 FORM补充(随时更新),F/Q操作,model之多对多,django中间件,缓存,信号

    python-day20 1.FROM生成select标签的数据应该来源于数据库. 2.model 操作 F/Q  (组合查询) 3.model 多对多操作. 4.中间件 :在请求到达url前先会经过 ...

随机推荐

  1. Word Cloud (词云) - R

    在前面已经陆续总结了如何用 Python 和 JavaScript 创建词云了,今天要说的是 R.其实 SPSS 和 SAS 的 Word Cloud 扩展模板都是基于 R 实现的. >> ...

  2. Eclipse 最新版2018-09安装Maven教程

    其实在写这篇教程之前,花了不少时间来学习安装Maven.不是链接打不开,要么就是提供的方法不适合我这个版本,当然了,既然你能看到这篇教程说明我已经找到了正确方法. 打开Eclipse-Help-> ...

  3. 【POJ - 1661】Help Jimmy (动态规划)

    Help Jimmy Descriptions: "Help Jimmy" 是在下图所示的场景上完成的游戏. 场景中包括多个长度和高度各不相同的平台.地面是最低的平台,高度为零,长 ...

  4. 第四章vs2107 代码实际运用-后台权限管理讲解 创建角色

    先看一下项目整体结构图: 实体类和数据操作都在前面用TT模板批量生产了.下面开始介绍权限代码这块的逻辑. 创建角色开始. 1. 角色的创建我们用到三张表 A.menuinfo(菜单表)  role(角 ...

  5. C++入门知识点总结

    阅读目录 1 C++中的命名空间 C++中使用命名空间来解决在相同文件或范围的同名变量问题,示例程序如下: #include <iostream> using namespace std; ...

  6. [POI2007]山峰和山谷Grz

    Description FGD小朋友特别喜欢爬山,在爬山的时候他就在研究山峰和山谷.为了能够让他对他的旅程有一个安排,他想知道山峰和山谷的数量.给定一个地图,为FGD想要旅行的区域,地图被分为\(n\ ...

  7. 51nod 1088 最长回文子串

    1088 最长回文子串 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 回文串是指aba.abba.cccbccc.aaaa这种左右对称的字符串. 输入一 ...

  8. 转 ORA-12638: 身份证明检索失败

    ORA-12638: 身份证明检索失败 的解决办法 2008年06月25日 星期三 11:42 the NTS option makes the Oracle client attempt to us ...

  9. 事件模型的介绍与Button的ActionListener

    事件监听: 这是个很重要的概念,也是个很重要的模型,vb,vc都是这样用,甚至后面学的web框架也在用.    现在我们可以做很多按钮了吧,但是我们的按钮按它是没反应的,现在我们来看看怎么样才能让它有 ...

  10. D. Alyona and a tree 公式转换 + 分块暴力

    http://codeforces.com/problemset/problem/740/D 对于每一对<u, v>.设dis[u]表示root到点u的距离,那么dis<u去v> ...