22)django-中间件
一:中间件介绍
django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,
django会根据自己的规则在合适的时机执行中间件中相应的方法。
在django项目的settings模块中,有一个 MIDDLEWARE_CLASSES 变量,其中每一个元素就是一个中间件。示例
settings.py 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)时候是从上到下顺序执行,返回(process_response)是下到上执行。
示例图如下:

中间件中可以定义五个方法,分别是:
- process_request(self,request)
- process_view(self, request, callback, callback_args, callback_kwargs)
- process_template_response(self,request,response)
- process_exception(self, request, exception)
- process_response(self, request, response)
以上方法的返回值可以是None和HttpResonse对象,如果是None,
则继续按照django定义的规则向下执行,如果是HttpResonse对象,则直接将该对象返回给用户。
三:自定义中间件
结合上面的5个方法观察中间件执行顺序。
自定义中间件需要继承:from django.utils.deprecation import MiddlewareMixin
1)process_request方法执行顺序
创建文件middle.m1.py
#middle.m1.py
# -*- coding:utf-8 -*-
__author__ = 'shisanjun'
from django.utils.deprecation import MiddlewareMixin
class Row1(MiddlewareMixin): def process_request(self,request): #这就表示写了个中间件了
print(111) class Row2(MiddlewareMixin): def process_request(self,request): #这就表示写了个中间件了
print(222) class Row3(MiddlewareMixin): def process_request(self,request): #这就表示写了个中间件了
print(3333)
上面创建三个中间件,还需要在settings.py中设置。
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.m1.Row1',
'middle.m1.Row2',
'middle.m1.Row3',
]
测试views.py
def test(request):
int("aaa")
print("小姨妈")
return HttpResponse("ok")
urls.py
url(r'^test/', views.test),
测试结果:
#结果
======================================
111
222
3333
小姨妈
执行顺序

2)中间件里有process_response(self, request, response),此方法需要返回return response,否则报错。
__author__ = 'shisanjun'
from django.utils.deprecation import MiddlewareMixin
class Row1(MiddlewareMixin): def process_request(self,request): #这就表示写了个中间件了
print(111) def process_response(self,request,response):
pass class Row2(MiddlewareMixin): def process_request(self,request): #这就表示写了个中间件了
print(222)
def process_response(self,request,response):
pass class Row3(MiddlewareMixin): def process_request(self,request): #这就表示写了个中间件了
print(3333)
def process_response(self,request,response):
pass 报错:这说明views有返回值,但是中间件没有取,process_response没有做处理,需要返回response
AttributeError at /test/
'NoneType' object has no attribute 'get'
修改如下:
修改:
# -*- coding:utf-8 -*-
__author__ = 'shisanjun'
from django.utils.deprecation import MiddlewareMixin
class Row1(MiddlewareMixin): def process_request(self,request): #这就表示写了个中间件了
print(111) def process_response(self,request,response):
print("到1了")
return response class Row2(MiddlewareMixin): def process_request(self,request): #这就表示写了个中间件了
print(222)
def process_response(self,request,response):
print("到2了")
return response class Row3(MiddlewareMixin): def process_request(self,request): #这就表示写了个中间件了
print(3333)
def process_response(self,request,response):
print("到3了")
return response
结果:
#结果
Quit the server with CTRL-BREAK.
111
222
3333
小姨妈
到3了
到2了
到1了
执行顺序:

这里request和response就是view中的,所以request含有所有HTTP请求
中间有什么用了?
可以在中间件做一些判断,比如在中间件判断是不是有请求头,如果没有就不让往后面走(可以直接return HttpResponse)
django,在1.10版本中在那个中间件返回,就从那个返回。
在1.7,1。8版本中不是,是在中间的中间件要求返回,但是还是会走到最后一个中间,再返回。
中间件适合什么操作了?对所有请求做统一的操作。
3)中间件里有process_view(self,request,view_func,view_args,view_kwargs):。
# -*- coding:utf-8 -*-
__author__ = 'shisanjun'
from django.utils.deprecation import MiddlewareMixin
class Row1(MiddlewareMixin): def process_request(self,request): #这就表示写了个中间件了
print(111) def process_view(self,request,view_func,view_args,view_kwargs):
print("中间1") def process_response(self,request,response):
print("到1了")
return response class Row2(MiddlewareMixin): def process_request(self,request): #这就表示写了个中间件了
print(222)
def process_view(self,request,view_func,view_args,view_kwargs):
print("中间2")
def process_response(self,request,response):
print("到2了")
return response class Row3(MiddlewareMixin): def process_request(self,request): #这就表示写了个中间件了
print(3333)
def process_view(self,request,view_func,view_args,view_kwargs):
print("中间3")
def process_response(self,request,response):
print("到3了")
return response #结果
Quit the server with CTRL-BREAK.
111
222
3333
中间1
中间2
中间3
小姨妈
到3了
到2了
到1了 view_func就是view函数
顺序

4)中间件里有process_exception(self, request, exception)
class Row3(MiddlewareMixin):
def process_request(self,request): #这就表示写了个中间件了
print(3333)
def process_view(self,request,view_func,view_args,view_kwargs):
print("中间3")
def process_response(self,request,response):
print("到3了")
return response
def process_exception(self, request, exception):#当view出错的时候执行
print("err")
比如
def test(request):
int("aaa")#这里转换为整数,会报错,就会调用上面的process_exception
print("小姨妈")
return HttpResponse("ok")
5)中间件里有process_template_response(self,request,response)
class Row3(MiddlewareMixin):
def process_request(self,request): #这就表示写了个中间件了
print(3333)
def process_view(self,request,view_func,view_args,view_kwargs):
print("中间3")
def process_response(self,request,response):
print("到3了")
return response
def process_exception(self, request, exception):#什么时候执行了,当views函数出错了,就执行了
if isinstance(exception,ValueError):
print(9999)
def process_template_response(self,request,response):
#如果views中的函数返回对象中,具有render方法,就会执行。
print("process_template_response")
22)django-中间件的更多相关文章
- 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前先会经过 ...
- Django学习之七:Django 中间件
目录 Django 中间件 自定义中间件 - - - 大体两种方式 将中间件移除 实例 中间件加载源码阅读 总结 Django 中间件 Tips: 更新日志: 2019.01.31 更新django中 ...
- Django中间件的使用
Django中间件的使用 中间件(middleware) 中间件应用于request与服务端之间和服务端与response之间,客户端发起请求到服务端接收可以通过中间件,服务端返回响应与客户端接收响应 ...
- Django中间件 及 form 实现用户登陆
Django中间件 及 form 实现用户登陆 Form 验证 密码调用md5 加密存储 form.add_error("字段名", "错误信息") 自定义错误 ...
- Django 2.0 学习(20):Django 中间件详解
Django 中间件详解 Django中间件 在Django中,中间件(middleware)其实就是一个类,在请求到来和结束后,Django会根据自己的规则在合适的时机执行中间件中相应的方法. 1. ...
- Django中间件的5种自定义方法
阅读目录(Content) Django中间件 自定义中间件 中间件(类)中5种方法 中间件应用场景 回到顶部(go to top) Django中间件 在http请求 到达视图函数之前 和视图函 ...
- Python自动化之Django中间件
django中间件 Django请求生命周期 中间件中可以定义方法,分别是 process_request(self,request) process_view(self, request, call ...
- Django中间件如何处理请求
Django中间件 在http请求 到达视图函数之前 和视图函数return之后,django会根据自己的规则在合适的时机执行中间件中相应的方法. Django1.9版本以后中间件的执行流程 1. ...
随机推荐
- JAVA 线程池之Callable返回结果
本文介绍如何向线程池提交任务,并获得任务的执行结果.然后模拟 线程池中的线程在执行任务的过程中抛出异常时,该如何处理. 一,执行具体任务的线程类 要想 获得 线程的执行结果,需实现Callable接口 ...
- 使用JAVA数组实现顺序栈
1,首先总结一下线性表(分为顺序表和链接表,[即顺序存储结构和链式存储结构的区别])和栈(顺序栈和链接栈)还有队列(顺序队列和链接队列)的JAVA类库中的实现: java.util.ArrayList ...
- springboot(十七):过滤器(Filter)和拦截器(Interceptor)
概述 在做web开发的时候,过滤器(Filter)和拦截器(Interceptor)很常见,通俗的讲,过滤器可以简单理解为“取你所想取”,忽视掉那些你不想要的东西:拦截器可以简单理解为“拒你所想拒”, ...
- Windows 操作系统
Microsoft Windows,是美国微软公司研发的一套操作系统,它问世于1985年,起初仅仅是Microsoft-DOS模拟环境,后续的系统版本由于微软不断的更新升级,不但易用,也慢慢的成为家家 ...
- 访问权限,public private protected
百度经验这篇文章很不错:https://jingyan.baidu.com/article/bad08e1e8e9a9b09c851219f.html
- 【python小练】0020
第 0020 题: 登陆中国联通网上营业厅 后选择「自助服务」 --> 「详单查询」,然后选择你要查询的时间段,点击「查询」按钮,查询结果页面的最下方,点击「导出」,就会生成类似于 2014年1 ...
- 洛谷P2699小浩的幂次运算
二分走一波,没想到题解的大佬做法 p_q 注意爆long long,所以先对数取一下上限 二分确定下限,然后输出 #include<stdio.h> #include<math.h& ...
- python函数解释
实现某个功能的一些代码提高代码的复用性函数必须被调用才会执行函数里面定义的变量都叫局部变量,只要一出了函数就不能用了函数里面如果调用时需要拿到结果但是最后没写return(不必须写,如读取文件时就需要 ...
- Shiro入门 - 通过自定义Realm连数数据库进行认证
添加shiro-realm.ini文件 [main] #自定义Realm myRealm=test.shiro.MyRealm #将myRealm设置到securityManager,相当于Sprin ...
- mysql 案例 ~ insert插入慢的场景
一简介: insert出现慢日志中,应该怎么检测呢 二 理解:事务提交延迟,一般出现在写日志延迟的情况下,会有几种可能 场景: 1 RR模式下,insert等待gap lock锁导致的 ...