一:中间件介绍

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

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

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

  2. django 中间件

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

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

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

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

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

  5. Django中间件的使用

    Django中间件的使用 中间件(middleware) 中间件应用于request与服务端之间和服务端与response之间,客户端发起请求到服务端接收可以通过中间件,服务端返回响应与客户端接收响应 ...

  6. Django中间件 及 form 实现用户登陆

    Django中间件 及 form 实现用户登陆 Form 验证 密码调用md5 加密存储 form.add_error("字段名", "错误信息") 自定义错误 ...

  7. Django 2.0 学习(20):Django 中间件详解

    Django 中间件详解 Django中间件 在Django中,中间件(middleware)其实就是一个类,在请求到来和结束后,Django会根据自己的规则在合适的时机执行中间件中相应的方法. 1. ...

  8. Django中间件的5种自定义方法

    阅读目录(Content) Django中间件 自定义中间件 中间件(类)中5种方法 中间件应用场景 回到顶部(go to top) Django中间件 在http请求 到达视图函数之前   和视图函 ...

  9. Python自动化之Django中间件

    django中间件 Django请求生命周期 中间件中可以定义方法,分别是 process_request(self,request) process_view(self, request, call ...

  10. Django中间件如何处理请求

    Django中间件 在http请求 到达视图函数之前   和视图函数return之后,django会根据自己的规则在合适的时机执行中间件中相应的方法. Django1.9版本以后中间件的执行流程 1. ...

随机推荐

  1. C# WinForm多线程(一)----- Thread类库

    Windows是一个多任务的系统,如果你使用的是windows 2000及其以上版本,你可以通过任务管理器查看当前系统运行的程序和进程.什么是进程呢?当一个程序开始运行时,它就是一个进程,进程所指包括 ...

  2. leetcode 90. subsets

    解题思路: 要生成子集,对于vector 中的每个数,对于每个子集有两种情况,加入或不加入. 因此代码: class Solution { public: void subsetG(vector< ...

  3. springboot的@CrossOrigin注解解决细粒度的配置跨域

    import java.util.HashMap; import org.springframework.web.bind.annotation.CrossOrigin; import org.spr ...

  4. 阿里云三台CentOS7.2配置安装CDH5.12

    1 购买3台阿里云服务 2 配置好ssh连接客户端 根据自己情况连接 3 安装好MySQL5.7 跳过,见之前博客 安装在hadoop001上 4 设置好Hosts文件 3台机器同时操作 vim /e ...

  5. day 8 - 1 文件操作

    文件操作 注意: 1. r+ 最为常用 2.encoding 的编码格式一定要与文件编码格式一致 读取 r  rb #在本地创建 txt 格式的文件默认使用 gbk 格式 f = open('e:/p ...

  6. Menu显示三个点,不显示内容

    先说下menu的使用 首先自定义一个menu选项 <menu xmlns:android="http://schemas.android.com/apk/res/android&quo ...

  7. Handler的postDelayed的实现方法

    暂存,待归纳 https://www.jianshu.com/p/f5f710d55255 https://blog.csdn.net/qingtiantianqing/article/details ...

  8. light oj 1011 - Marriage Ceremonies

    题目大意: 给出n*n的矩阵Map,Map[i][j]代表第i个男人和第j个女人之间的满意度,求男女一一配对后,最大的满意度之和. 题目思路:状态压缩 题目可看做每行取一点,所有点不同列的情况下,各个 ...

  9. Solr版本问题分析

    在之前的Solr版本中(Solr5之前),在创建core的时候,Solr会自动创建好schema.xml,但是在之后的版本中,新加入了动态更新schema功能,这个默认的schema.xml确找不到了 ...

  10. SpringTask定时任务的使用

    实现定时任务简单的有四种方式:Timer\ScheduledThreadPool线程池\quartz(常用),还有另一种就是springtask. 都说springtask上手简单,于是简单的研究一下 ...