Django2.0——中间件
Django中间件middleware本质是一个类,在请求到返回的中间,类中不同的方法会在指定的时机中被触发。setting.py的变量MIDDLEWARE_CLASSES中的每一个元素都是中间件,且这些注册的中间件之间,有着严格的执行顺序。在request到url层之间,中间件的执行顺序是从上而下,依次执行。在response到浏览器之间,中间的执行顺序变成从下至上。

通常情况下,Django默认配置的中间件如下:
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',
]
中间件的执行顺序如下图所示:

写中间件类的定义五种方法如下,它们分别代表着各自不同的执行时机。
- process_request(self,request):执行视图前被调用,返回None或HttpResponse对象
- process_view(self,request,callback,callback_args,callback_kwargs):调用视图函数之前被执行,返回None或HttpResponse
上面两个方法是在请求到视图之间可以被执行的方法,若其中任意一个返回的HttpResponse,那么这个请求就不会到达视图层,而是直接返回给浏览器。
- process_template_response(self,request,response):视图函数渲染模板后立即被调用。
- process_exception(self,request,exception):在视图函数抛出异常时被调用,返回一个HttpResponse对象。
- process_response(self,request,response):所有响应返回到浏览器之前被调用,返回一个HttpResponse对象。
以上三个方法都是发生在response到客户端之间。
自定义中间件
自定义中间件要导入from django.utils.deprecation import MiddlewareMixin,下面写的类都是基于MiddlewareMixin来写。自定义的中间件写好后要记得在setting中进行注册。中间件的作用范围是整个项目下的所有主路由及其子路由(各个app)。
自定义中间件的第一种方式:
from django.utils.deprecation import MiddlewareMixin
from django.http import HttpResponse
class Usermiddle(MiddlewareMixin):
def process_request(self,request):
print('这是方法1')
return None
def process_view(self,request,callback,callback_args,callback_kwargs):
print('这是方法2')
return None
def process_template_response(self,request,response):
print('渲染模板后执行')
return response
def process_exception(self,request,exception):
print('视图函数抛出异常')
return HttpResponse(exception)
def process_response(self,request,response):
print('这是方法5')
return response
自定义中间件的第二种方式:
class Usermiddle1(object):
def __init__(self,get_response):
self.get_response = get_response
def __call__(self, request):
#从这开始是请求到视图前执行的语句
print('xxx')
#从这结束请求到视图前执行的语句
response = self.get_response(request)
# 从这开始是response到浏览器前执行的语句
print('xxx')
# 从这结束response到浏览器前执行的语句
return response
注册这两个类:

Django2.0——中间件的更多相关文章
- 《玩转Django2.0》读书笔记-Django配置信息
<玩转Django2.0>读书笔记-Django配置信息 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 项目配置是根据实际开发需求从而对整个Web框架编写相应配置信息. ...
- Django2.0.1开发框架搭建
1.使用vs2017创建空白django项目 2.右键python环境的env---安装python包 升级django到2.0.1和setuptools到38.4.0版本,具体环境如下: 3.配置 ...
- Djang1.8+Python2.0迁移到Django2.0+Python3.6注意事项(转)
Djang1.8+Python2.0迁移到Django2.0+Python3.6注意事项 参考:https://blog.csdn.net/weixin_40475396/article/detail ...
- django2.0+linux服务器 ,如何让自己电脑访问
这几天一直在搞这个服务器端口开放问题,来让自己电脑可以访问服务器下的django网页,今天终于弄好了~~~~~离成功又进了一步~~~~~ 1.首先,我们来开放一个linux服务器的端口(我开放了828 ...
- Django2.0中文文档
title: Django2.0中文文档 tags: Python,Django,入沐三分 grammar_cjkRuby: true --- Django2.0版本已经发布了,我们先来看一个图片 从 ...
- python3下Django2.0配置最新xadmin详解
1,打开pycharm,创建一个Django项目 2,安装Django,默认是最新版本,pip3 install -i https://pypi.douban.com/simple/ django 3 ...
- 【Python3.6+Django2.0+Xadmin2.0系列教程一】环境搭建及项目创建
由于工作需要,接触了大半年时间的Django+xadmin框架,一直没空对这块对进行相关的梳理.最近在同事的怂恿下,就在这分享下笔者的学习及工作经验吧. 好了,话不多说,下面开始进入正题: 环境需求: ...
- Django:Python3.6.2+Django2.0配置MySQL
持续学习Django中... Django默认使用的数据库是python自带的SQLlite3,但SQLlite并不适用于大型的项目,因此我将数据库换成了MySQL,下面介绍下Django如何配置数据 ...
- Django2.0版本 path与Django1.x版本url正则匹配问题
Django1.x版本url正则匹配如下: Django2.0版本正则匹配则要导入re_path模块如下:
随机推荐
- UVA - 10635 Prince and Princess(LCS,可转化为LIS)
题意:有两个长度分别为p+1和q+1的序列,每个序列中的各个元素互不相同,且都是1~n2的整数.两个序列的第一个元素均为1.求出A和B的最长公共子序列长度. 分析: A = {1,7,5,4,8,3, ...
- python中添加requests资源包
1.进入资源网址下载:https://www.lfd.uci.edu/~gohlke/pythonlibs/ 2.按下CTRL+F进行页面查找“requests” 3.点击requests-2.22. ...
- 由sqli-labs/Less-5学习各种基础盲注技巧
本文为本人在学习中的总结,仅涉及基础的盲注技巧,可能多有疏漏之处,欢迎指教. 另外本人博客的SQL注入分类下有一些方面的详细讲解,在此只介绍简单的使用. 0x00.介绍一下本人对盲注的总结. 盲注就是 ...
- 基础语法-循环结构for
基础语法-循环结构for 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.for循环格式 for(初始化表达式;循环条件表达式;循环后的操作表达式){ 执行语句(循环体); } ...
- Java算法练习——最长回文子串
题目链接 题目描述 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1 输入: "babad" 输出: "bab" ...
- python里的反射(自学习)
在做程序开发中,我们常常会遇到这样的需求:需要执行对象里的某个方法,或需要调用对象中的某个变量,但是由于种种原因我们无法确定这个方法或变量是否存在,这是我们需要用一个特殊的方法或机制要访问和操作这个未 ...
- mysql+MHA高可用 (一主双从)
1.准备三台服务器 10.0.0.12 10.0.0.13 10.0.0.14 2.在三台服务器上执行操作 时间同步 [root@ c7m01 ~]# echo "*/5* * * * /u ...
- Linux / MacOS 下Redis 安装、配置和连接
下载 下载redis压缩包 最新的为 5.0.4 地址 http://download.redis.io/releases/redis-5.0.4.tar.gz 安装 1 解压 切换工作目录到redi ...
- JS高级学习笔记(10) 之 js 时怎么解析HTML标签的
DOM 节点类型 浏览器渲染过程 浏览器是怎么把HTML标签语言和JavaScript联系在一起的,这就是我们常说的DOM. 浏览器中的DOM解析器把HTML翻译成对象(object),然后JavaS ...
- POJ-3629 模拟
A - Card Stacking Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u S ...