一、中间件

  在django的settings.py文件下,有一个变量为MIDDLEWARE,里面放的就是中间件。

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',
] 上面就是Django自带的7个中间件,我们想看中间件长什么样子,只需要复制中间件,用from引入,点进去看就可以了。
比如看第二个中间件:from django.middleware.sessions.middleware import SessionMiddleware,看到的结果如下:
class SessionMiddleware(MiddlewareMixin):
def __init__(self, get_response=None):
self.get_response = get_response
engine = import_module(settings.SESSION_ENGINE)
self.SessionStore = engine.SessionStore def process_request(self, request):
session_key = request.COOKIES.get(settings.SESSION_COOKIE_NAME)
request.session = self.SessionStore(session_key) def process_response(self, request, response):
     。。。。。。
我把process_response()方法下的东西省略了。但我们可以清楚的看出它就是一个继承于MiddlewareMixin的类。

  所谓的中间件,就是存在于socket和视图函数中间的一种过滤器。浏览器客户端通过socket发送请求来,要经过一层层中间件的process_request()方法,在进入视图,视图函数执行完毕后,又要经过一层层中间件的process_response()方法,然后再通过socket发送给浏览器客户端。Django服务器端的socket是由wsgiref模块封装而成的,它还帮我们把原生的数据解析成了request对象,从而在Django服务器端才可以用request对象去拿值。

  中间件有四个方法,分别是:

1,process_request(self,request)
2,process_response(self, request, response)
3,process_view(self, request, callback, callback_args, callback_kwargs)
4,process_exception(self, request, exception)

  现在我们一个一个的来分析每个方法的运用及效果,四个方法讲完了,中间件就学完了。

  二、process_request(),process_response()

  上面我们说了,浏览器发送请求过来,会经过一层层的process_request,具体来说,会从最上面的中间件到最下面的中间件。执行完视图函数之后,会从从下往上执行每个中间件的process_response(),之后再发送给浏览器。

  通常情况下,process_request()是不会写return的,一旦某个中间件的process_request()写了return,那后面的中间件的process_request()就不会执行了,也不会到视图函数了,直接从自己的process_response()依次往上返回。

  通常情况下,process_response()都要写上return response。一旦有一个中间件的process_response()没有写return response,那么数据走到这一个中间件时,数据就会丢失,后面要执行的中间件的process_response()都会没有数据。

  三、process_views()

  上面的第二点的执行流程是基于只有request和response的情况下的,如果加上了process_views()。首先还是先走每个中间件的request,然后走到urls.py文件,但现在不会马上去执行视图,而是先要从上往下走每个中间件的process_views(),走完之后再走视图函数,再走每个中间件的response。

  第一步是process_request,第二步是process_views,第三步是执行视图函数,第四步是process_response

  通常情况下,process_views 也不要加return Httpresponse('fff'),一旦加上了,从这个中间件以下的中间件的process_views就不会执行,视图函数也不会执行。直接跳到最下面中间件的response开始返回。

  第一步是process_request,第二步是走部分的process_views,第三步是process_response

  process_views()方法还可以写上回调视图函数,它会把对应的视图函数给执行了,然后返回

def process_view(self,request,callback,callback_args,callback_kwargs):    response=callback(request,*callback_args,**callback_kwargs)     
   #callback就是在经过urls.py时对应的视图函数,现在直接在process_views()直接回调视图函数,并且执行
return response
这种情况下,会在执行这个中间件的process_views,把对应的视图函数也一起执行了,然后就直接到最下面中间件从下往上执行response,返回

  第一步是prosee_request,第二步是走部分的process_views,第三步是执行process_views里的回调视图函数,第四步是process_response

  四、process_exception()

  上面的执行流程是基于没有process_exception()情况下的,加上process_exception(),在执行完视图函数之后,后从下往上执行中间件的process_exception(),然后在从下往上执行中间件的response,然后返回。process_exception()的作用是捕获视图函数的错误。

  第一步是process_request,第二步process_views,第三步执行视图函数,第四步process_exception,第五步是process_response.

  五、自定义中间件

  在全局创建一个文件夹middlewares,在里面创建一个m1.py

from django.utils.deprecation import MiddlewareMixin
class M1(MiddlewareMixin):
def process_request(self,request):
print('M1.process_request') def process_view(self,request,callback,callback_args,callback_kwargs):
print('M1.process_view')
response=callback(request,*callback_args,**callback_kwargs)
return response def process_response(self,request,response):
print('M1.process_response')
return response

  记得在settings.py下的middleware加上'middleware.m1',如下

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',
'middleware.M1',
]

  这样,每次请求进来都会走你的中间件的process_request(),执行完视图函数后,都会走你的中间件的process_response()。

  当我们多数的视图函数都要进行一个操作时,我们就可以考虑自定义一个中间件,把要执行的操作放在里面就可以不用再每个视图里面再写这些代码了。

  但只有一小部分视图函数要进行某一操作,我们可以考虑自定义一个装饰器,然后在需要这操作的视图函数上面写上语法糖,也可以解决代码复用的效果。

Django组件之Middleware的更多相关文章

  1. Django组件——分页器和中间件

    分页器 Django内置分页器(paginator) 分页器函数为paginator,里面有几个重要的参数需要我们了解 paginator = Paginator(book_list, 10) #第二 ...

  2. Django组件拾忆

    知识预览 一 Django的form组件 二 Django的model form组件 三 Django的缓存机制 四 Django的信号 五 Django的序列化 回到顶部 一 Django的form ...

  3. Django组件补充(缓存,信号,序列化)

    Django组件补充(缓存,信号,序列化) Django的缓存机制 1.1 缓存介绍 1.缓存的简介 在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增,删,查,改,渲染模板,执行业务逻辑 ...

  4. 转载,Django组件

    知识预览 一 Django的form组件 二 Django的model form组件 三 Django的缓存机制 四 Django的信号 五 Django的序列化 回到顶部 一 Django的form ...

  5. 09 Django组件之用户认证组件

    没有学习Django认证组件之前使用装饰器方法 from django.shortcuts import render, HttpResponse, redirect from app01.MyFor ...

  6. Django组件---Django请求生命周期和中间件

    Django组件---Django请求生命周期和中间件 Django请求生命周期 说明: client代表浏览器,浏览器的内部为我们封装了socket,Django的WSGI模块也为我们封装了sock ...

  7. Django组件总结

    Django组件介绍 分页器的使用 分页器在页面中非常常见,当数据库条数数据过多时,页面一次性显示不好看时,我们可以使用分页器,将数据分几次显示. 1.1 数据库内插入大量数据 Booklist=[] ...

  8. Django分析之Middleware中间件

    写了几周的脚本,今天终于开始接触web框架了~学习Python的web框架,那么Django就几乎是必修课了,这次的工作是先打打下手,主要的任务是在setting中添加版本号,在渲染静态css,js的 ...

  9. Django组件-中间件

    1.中间件的概念 中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出.因为改变的是全局,所以需要谨慎实用,用不好会影 ...

随机推荐

  1. JavaScript 方法

    对象的定义 var xiaoming = { name: '小明', birth: 1990 }; 是,如果我们给xiaoming绑定一个函数,就可以做更多的事情.比如,写个age()方法,返回xia ...

  2. 甲方安全建设之office365邮箱弱口令检测

    甲方安全建设之office365邮箱弱口令检测 信息收集 资产范围 资产列表总数是521 抓包后发现只有102 一番测试之后发现控制Response的关键在于MaxEntriesReturned字段, ...

  3. org.apache.subversion.javahl.ClientException: Previous operation has not finished

    1.问题 eclipse使用SVN出现异常: org.apache.subversion.javahl.ClientException: Previous operation has not fini ...

  4. Eclipse中一些真正常用的快捷键

    F2 文件重命名(要使用某个过长的文件名或者不好打的文件名时,直接F2再Ctrl+C非常好用,比如:Validform_v5.3.2_min.js) Ctrl+S 保存当前文件 Ctrl+Shift+ ...

  5. Unix时间戳转日期时间格式,C#、Java、Python各语言实现!

    之前有个Q上好友没事问我,怎么自己写Unix时间戳转日期时间?于是我就顺手写了个C#版本给他!最近想起来,就萌发多写几个语言的版本分享,权当练习思路外加熟悉另外两种语言. 先说转换步骤 先处理年份,从 ...

  6. Dynamic Programming | Set 3 (Longest Increasing Subsequence)

    在 Dynamic Programming | Set 1 (Overlapping Subproblems Property) 和 Dynamic Programming | Set 2 (Opti ...

  7. tomcat 启动报错org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalin

    IDEA tomcat 7.0.53 严重: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: Failed ...

  8. video设置autoplay 不起作用

    video 标签上添加 muted https://blog.csdn.net/taiyangmiaomiao/article/details/80266625

  9. java中的io系统详解

    相关读书笔记.心得文章列表 Java 流在处理上分为字符流和字节流.字符流处理的单元为 2 个字节的 Unicode 字符,分别操作字符.字符数组或字符串,而字节流处理单元为 1 个字节,操作字节和字 ...

  10. typescript handbook 学习笔记4

    概述 这是我学习typescript的笔记.写这个笔记的原因主要有2个,一个是熟悉相关的写法:另一个是理清其中一些晦涩的东西.供以后开发时参考,相信对其他人也有用. 学习typescript建议直接看 ...