Python语言之Django中间件执行顺序
小标 2018-08-08 来源 : 阅读 1571 评论 0

摘要:本文主要向大家介绍了Python语言之Django中间件执行顺序,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助。

本文主要向大家介绍了Python语言之Django中间件执行顺序,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助。

中间件
Django中的中间件是一个轻量级、底层的插件系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出。中间件的设计为开发者提供了一种无侵入式的开发方式,增强了Django框架的健壮性。
我们可以使用中间件,在Django处理视图的不同阶段对输入或输出进行干预。
1 中间件的定义方法
定义一个中间件工厂函数,然后返回一个可以别调用的中间件。
中间件工厂函数需要接收一个可以调用的get_response对象。
返回的中间件也是一个可以被调用的对象,并且像视图一样需要接收一个request对象参数,返回一个response对象。

?12345678910111213def simple_middleware(get_response):    # 此处编写的代码仅在Django第一次配置和初始化的时候执行一次。     def middleware(request):        # 此处编写的代码会在每个请求处理视图前被调用。         response = get_response(request)         # 此处编写的代码会在每个请求处理视图之后被调用。         return response     return middleware

例如,在users应用中新建一个middleware.py文件,

?12345678def my_middleware(get_response):    print('init 被调用')    def middleware(request):        print('before request 被调用')        response = get_response(request)        print('after response 被调用')        return response    return middleware

定义好中间件后,需要在settings.py 文件中添加注册中间件

?12345678910MIDDLEWARE = [    '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',    'users.middleware.my_middleware',  # 添加中间件]

定义一个视图进行测试

?123def demo_view(request):    print('view 视图被调用')    return HttpResponse('OK')

执行结果

注意:Django运行在调试模式下,中间件init部分有可能被调用两次。
2 执行流程

3 多个中间件的执行顺序

在请求视图被处理前,中间件由上至下依次执行
在请求视图被处理后,中间件由下至上依次执行


示例:
定义两个中间件

?1234567891011121314151617def my_middleware(get_response):    print('init 被调用')    def middleware(request):        print('before request 被调用')        response = get_response(request)        print('after response 被调用')        return response    return middleware def my_middleware2(get_response):    print('init2 被调用')    def middleware(request):        print('before request 2 被调用')        response = get_response(request)        print('after response 2 被调用')        return response    return middleware

注册添加两个中间件

?1234567891011MIDDLEWARE = [    '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',    'users.middleware.my_middleware',  # 添加    'users.middleware.my_middleware2',  # 添加]

执行结果  

?1234567init2 被调用init 被调用before request 被调用before request 2 被调用view 视图被调用after response 2 被调用after response 被调用

总结:中间件的本质其实就是个装饰器,对于装饰器我之前的随笔里也详细说过,装饰器的本质其实就是个闭包

  对于装饰器来说,在这里程序从上到下执行,开始记录装饰器1-3,然后读到了函数的时候,装饰器开始装饰,把函数的引用传入装饰器中,从装饰器3开始往上装饰,所以这时候开始执行装饰器3的初始化,并把装饰完的函数当做一个新的函数,再次把新的引用传入到装饰器2,接着装饰器2进行初始化,再次把新的函数的引用传入到装饰器1进行装饰,这时候装饰器1的初始化开始,并开始执行,从而接下来的执行顺序为1-3执行装饰的内容,最后再执行本来的函数,达到一个对原有函数增加功能和特性的要求。
装饰器:从程序开始的顺序,从上到下读取----》从下到上装饰----》从上到下执行
  在中间件中,执行顺序等同,只不过中间件装饰的是视图函数或者是试图类,会有一个init()初始化,为了便于理解我在说明装饰器顺序的时候,那里说的初始化就是现在的init(),也就是中间件在执行上也是从最接近函数或者类的中间件开始初始化,在中间件注册时,如果有多个中间件,程序按照从上到下的顺序来确认中间件,接着执行视图函数的时候,开始从下到上的进行init(),这里的初始化init()类似于Flask框架里四种请求勾子中的请求开始前执行一次的意思,从下到上执行完init后,再从上到下执行请求前所要执行的代码(见上文),请求完成后再从下往上执行请求后的代码(见上文)。
中间件:从程序开始的顺序,从上到下读取----》从下到上初始化init()----》从上到下执行请求前----》视图的请求----》从下到上执行请求后
 .title { font-family: KaiTi; font-size: 16px; font-weight: bold; color: #777 } 

本文由职坐标整理并发布,希望对同学们学习Python有所帮助,更多内容请关注职坐标编程语言Python频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved