django 之 中间件

在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的规则在合适的时机执行中间件中相应的方法。

在django项目的settings模块中,有一个 MIDDLEWARE_CLASSES 变量,其中每一个元素就是一个中间件,一个正常的请求会穿过所有的中间件最后到达view函数,最后又穿过中间件返回给用户

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',
]

中间件的作用:适用于对所有的请求作处理,如黑名单过滤 或 公共校验等

 

示例:自定义中间件

模仿其他的中间件(from django.middleware.csrf import CsrfViewMiddleware)

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

class Row1(MiddlewareMixin):
    def process_request(self,request):
        print('row1-1')

    def process_view(self, request, view_func, view_func_args, view_func_kwargs):
        print('row1-2')

    def process_response(self, request, response):
        print('row1-3')
        return response


class Row2(MiddlewareMixin):
    def process_request(self,request):
        print('row2-1')
        # return HttpResponse('xxx')  如果此处返回,则不再往下走,结果:'row1-1'=>'row2-1'=>'row2-3'=>'row1-3'

    def process_view(self, request, view_func, view_func_args, view_func_kwargs):
        print('row2-2')

    def process_response(self, request, response):
        print('row2-3')
        return response

class Row3(MiddlewareMixin):
    def process_request(self,request):
        print('row3-1')

    def process_view(self, request, view_func, view_func_args, view_func_kwargs):
        print('row3-2')

    def process_response(self, request, response):
        print('row3-3')
        return response

执行顺序:
1、先执行所有的 process_request()函数: 打印'row1-1'=>'row2-1'=>'row3-1'
2、匹配urls路由规则,读取到view函数中的参数,依次执行 process_view()函数:打印'row1-2'=>'row2-2'=>'row3-2'
3、执行view.py 函数,并将结果返回:打印'row3-3'=>'row3-2'=>'row3-1'

 

自定义中间件除了以上3个常用方法,还可以定义以下两个:

process_exception(self, request, exception)

process_template_response(self,request,response)

class Row4(MiddlewareMixin):
    def process_request(self,request):
        print('row4-1')

    def process_view(self, request, view_func, view_func_args, view_func_kwargs):
        print('row4-2')

    def process_response(self, request, response):
        print('row4-3')
        return response

    def process_exception(self, request, exception):
        # 如果view.py 中出现异常时才执行
        if isinstance(exception,ValueError):
            return HttpResponse('出现异常')

    def process_template_response(self,request,response):
         # 如果Views中的函数返回的对象中,具有render方法, 如下view.py
        print('xxx')
        return response     

# view.py
class Foo:
  def render(self):
    return HttpResponse('OK')

def test(request):
  print('xxx')
  return Foo()

 

注册中间件:自定义完中间件,在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',
]

 

posted @ 2018-01-24 15:49  bobo0609  Views(162)  Comments(0)    收藏  举报