django中间件-12

在django中,中间件其实就是一个类,他是一个可以介入django的 requestresponse 的钩子框架,在请求响应不同的阶段,执行类中不同的代码,用于在全局修改django的输入输出。

自定义中间件

自定义中间件有两种方式,使用函数定义,和使用类定义。

自定义中间件一般定义在项目目录或者‘应用目录下的 middleware.py 文件下。

函数定义

def simple_middleware(get_response):
    # 此处编写的代码仅在Django第一次配置和初始化的时候执行一次。

    def middleware(request):
        # 此处编写的代码会在每个请求处理视图前被调用。

        response = get_response(request)

        # 此处编写的代码会在每个请求处理视图之后被调用。

        return response

    return middleware

示例

def simple_middleware(get_response):
    print("django被初始化")

    def middleware(request):
        print("请求")
        response = get_response(request)
        print("响应")
        return response
    return middleware

访问视图执行结果

django被初始化
[20/Oct/2018 09:44:54] "POST /middleware HTTP/1.1" 200 12
请求
视图函数
响应

类定义

class SimpleMiddleware(object):
    def __init__(self, get_response):
        self.get_response = get_response
        # 此处编写的代码仅在Django第一次配置和初始化的时候执行一次。

    def __call__(self, request):
        # 此处编写的代码会在每个请求处理视图前被调用。

        response = self.get_response(request)
        # 此处编写的代码会在每个请求处理视图之后被调用。

        return response

示例

class SimpleMiddleware(object):
    def __init__(self, get_response):
        self.get_response = get_response
        print("初始化")

    def __call__(self, request):
        print("请求")

        response = self.get_response(request)
        print("响应")

        return response

访问视图执行结果

django初始化
[20/Oct/2018 10:13:34] "POST /middleware HTTP/1.1" 200 12
请求
视图函数
响应

与旧版本中间件的兼容

在Django 1.10版本之前,中间件设置名为MIDDLEWARE_CLASSES,是长这样的:

class Middleware(MiddlewareMixin):

    def __init__(self, get_response=None):
        # 此处编写的代码仅在Django第一次配置和初始化的时候执行一次。
        self.get_response = get_response

    def process_request(self, request):
       # 此处编写的代码会在每个请求处理视图前被调用。

    def process_response(self, request, response):
        # 此处编写的代码会在每个请求处理视图之后被调用。

        return response

示例

class Middleware(MiddlewareMixin):

    def __init__(self, get_response=None):
        print("django初始化")
        self.get_response = get_response

    def process_request(self, request):
        print("请求")

    def process_response(self, request, response):
        print("响应")

        return response

访问视图执行结果

django初始化
[20/Oct/2018 10:13:34] "POST /middleware HTTP/1.1" 200 12
请求
视图函数
响应
  • 参数get_response代表被访问的视图函数

中间件的执行顺序

中间件的执行顺序和注册顺序有关系。在视图函数处理前,会按注册顺序从上往下执行。在属兔函数处理后,会按注册顺序从上往下执行, 在初始化的时候,也是从下往上执行。

示例

定义两个中间件

def simple_middleware(get_response):
    print("django被初始化")

    def middleware(request):
        print("请求")
        response = get_response(request)
        print("响应")
        return response
    return middleware


class SimpleMiddleware(object):
    def __init__(self, get_response):
        self.get_response = get_response
        print("初始化")

    def __call__(self, request):
        print("请求")

        response = self.get_response(request)
        print("响应")

        return response

注册顺序

MIDDLEWARE = [
    'middleware.middleware.simple_middleware',
    'middleware.middleware.SimpleMiddleware',

执行结果

初始化2
django被初始化1
请求1
请求2
视图函数
响应2
响应1
posted @ 2018-10-25 16:18  拙言404  阅读(273)  评论(0编辑  收藏  举报