Django-中间件

中间件的概念

  中间件是介于request和response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出。因为改变的是全局,所以需要谨慎使用,用不好会影响到性能。

  如果你想修改请求,例如被传送到view中的HttpRequest对象,或者你想修改view返回的HttpResponse对象,这些都可以通过中间件来实现

  Django默认的Middleware

自定义中间件

  中间件一共有四个方法

process_request

process_view

process_exception

process_response

process_request,process_response

  当用户发起请求时会依次经过所有的中间件,这个时候的请求process_request,最后到达views的函数中,views函数处理后,再依次穿过中间件,这个时候是process_response,最后返回给请求者

  我们可以自己定义一个中间件,并在setting.py中进行相应配置

  Mymiddleware.py

from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse

class Md1(MiddlewareMixin):

    def process_reqeust(self,request):
        print('Md1请求')

    def process_response(self,request,response):
        print('Md1返回')
        return response


class Md2(MiddlewareMixin):

    def process_reqeust(self, request):
        print('Md2请求')
        #return HttpResponse('Md2中断')

    def process_response(self, request, response):
        print('Md2返回')
        return response

  views

from django.shortcuts import HttpResponse

# Create your views here.

def index(request):
    print('views')
    return HttpResponse('views')

  结果

   如果当请求到达请求2的时候直接不符合条件返回,即return Httpresponse(‘Md2中断’),程序把请求直接发给中间件2返回,然后依次返回到请求者

process_view 

from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse

class Md1(MiddlewareMixin):

    def process_request(self,request):
        print('Md1请求')

    def process_response(self,request,response):
        print('Md1返回')
        return response

    def process_view(self,request,callback,callback_args,callback_kwargs):
        print("Md1view")


class Md2(MiddlewareMixin):

    def process_request(self, request):
        print('Md2请求')
        #return HttpResponse('Md2中断')

    def process_response(self, request, response):
        print('Md2返回')
        return response

    def process_view(self,request,callback,callback_args,callback_kwargs):
        print("Md2view")

   结果如下

Md1请求
Md2请求
Md1view
Md2view
views
Md2返回
Md1返回

  过程如图

  当最后一个中间的process_request到达路由关系映射之后,返回到中间件1的process_view,然后依次往下,到达view函数,最后通过process_response依次返回到达用户

  process_view可以用来调用视图函数

from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse

class Md1(MiddlewareMixin):

    def process_request(self,request):
        print('Md1请求')

    def process_response(self,request,response):
        print('Md1返回')
        return response

    def process_view(self,request,callback,callback_args,callback_kwargs):
        # print("Md1view")
        response=callback(request,*callback_args,**callback_kwargs)
        return response

  结果如下

Md1请求
Md2请求
view函数...
Md2返回
Md1返回

  如果process_view有返回值,会越过其他的process_view以及视图函数,但是所有的process_response都还会执行

process_exception

  process_exception(self,request,exception)

class Md1(MiddlewareMixin):

    def process_request(self,request):
        print("Md1请求")
        #return HttpResponse("Md1中断")
    def process_response(self,request,response):
        print("Md1返回")
        return response

    def process_view(self, request, callback, callback_args, callback_kwargs):

        # return HttpResponse("hello")

        # response=callback(request,*callback_args,**callback_kwargs)
        # return response
        print("md1 process_view...")

    def process_exception(self):
        print("md1 process_exception...")

class Md2(MiddlewareMixin):

    def process_request(self,request):
        print("Md2请求")
        # return HttpResponse("Md2中断")
    def process_response(self,request,response):
        print("Md2返回")
        return response
    def process_view(self, request, callback, callback_args, callback_kwargs):
        print("md2 process_view...")

    def process_exception(self):
        print("md1 process_exception...")

  结果如下

Md1请求
Md2请求
md1 process_view...
md2 process_view...
view函数...
Md2返回
Md1返回

 

猜你喜欢

转载自www.cnblogs.com/iamluoli/p/9172039.html