码迷,mamicode.com
首页 > 其他好文 > 详细

Django--中间件

时间:2019-12-24 09:44:32      阅读:61      评论:0      收藏:0      [点我收藏+]

标签:gif   处理   message   opened   self   turn   click   int   use   

中间件

Django中的中间件是一个轻量级、底层的插件系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出。中间件的设计为开发者提供了一种无侵入式的开发方式,增强了Django框架的健壮性。

我们可以使用中间件,在Django处理视图的不同阶段对输入或输出进行干预。

1 中间件的定义方法

定义一个中间件工厂函数,然后返回一个可以别调用的中间件。

中间件工厂函数需要接收一个可以调用的get_response对象。

返回的中间件也是一个可以被调用的对象,并且像视图一样需要接收一个request对象参数,返回一个response对象。

第一种自定义方法:

技术图片
#定义中间件
def my_middleware(get_response):
    print(init 被调用)
    def middleware(request):
        print(before request 被调用)
        response = get_response(request)
        print(after response 被调用)
        return response
    return middleware

#定义视图
def demo_view(request):
    print(view 视图被调用)
    return HttpResponse(OK)


#init 被调用
#before request 被调用
#view 视图被调用
#after response 被调用
views.py

第二种自定义方法:

  • process_request(self,request) 发送请求
  • process_view(self, request, callback, callback_args, callback_kwargs) 执行完 request 预处理函数并确定待执行的 view 之后,但在 view 函数实际执行之前。
  • process_template_response(self,request,response) response参数应该是一个由view或者中间件返回的TemplateResponse对像(或等价的对象)。如果响应的实例有render()方法,process_template_response()会在view刚好执行完毕之后被调用。这个方法必须返回一个实现了render方法的响应对象。
  • process_exception(self, request, exception) 收集错误信息,当一个view引发异常时,Django会调用process_exception()来处理。返回一个None或一个HttpResponse对象。如果返回HttpResponse对象,会将响应交给处理响应的中间件处理。由于处理响应时是从下到上的,此层以上的process_exception()是不会被调用的。
  • process_response(self, request, response) 必须返回 HttpResponse 对象。这个 response 对象可以是传入函数的那一个原始对象(通常已被修改),也可以是全新生成的。
技术图片
from django.utils.deprecation import MiddlewareMixin
class UserYanzheng(MiddlewareMixin):
#视图处理前触发
    def process_request(self,request):
        print("用户中间件验证------>1111111")
#视图处理以后返回response时出发
    def process_response(self,request,response):
        print("用户验证中间件的response部分---------->")
        return response



#用户中间件验证------>1111111
#函数执行
#用户验证中间件的response部分---------->
views.py

 

2 执行流程

 

 

技术图片

 

 

 

3 多个中间件的执行顺序

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

技术图片

 

 

技术图片
def 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

def zhong1(get_response):
    print("我是测试1111")
    def jian(request):
        if request.path == "/app01/login/":
            print(我是测试222222)
            response = get_response(request)
            print("我是测试3333")
        else:
            print(我是测试二二二二二二)
            response = get_response(request)
            print("我是测试3333")

        return response
    return jian


from django.utils.deprecation import MiddlewareMixin
class UserYanzheng(MiddlewareMixin):
    def process_request(self,request):
        print("用户中间件验证------>1111111")

    def process_response(self,request,response):
        print("用户验证中间件的response部分---------->")
        return response
View.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,
    corsheaders.middleware.CorsMiddleware,
    ppapp01.views.my_middleware2,
    ppapp01.views.my_middleware,
    ppapp01.views.zhong1,
    ppapp01.views.UserYanzheng,
]
setting.py
我是测试1111
init 被调用
init2 被调用
before request 2 被调用
before request 被调用
我是测试二二二二二二
用户中间件验证------>1111111
函数执行
用户验证中间件的response部分---------->
我是测试3333
after response 被调用
after response 2 被调用

Django--中间件

标签:gif   处理   message   opened   self   turn   click   int   use   

原文地址:https://www.cnblogs.com/ppzhang/p/12089453.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!