Django中的中间件

中间件(相当于java中的拦截器)

  • Django中的中间件是一个轻量级、底层的插件系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出。中间件的设计为开发者提供了一种无侵入式的开发方式,增强了Django框架的健壮性。
  • 中间件类似于java中的拦截器。实现在浏览器发送请求后到视图接收到请求之前,以及视图返回响应后到浏览器接收到响应之前进行一些操作
  • 中间件实际上就是一个装饰器。可以理解为是一个作用在视图上的装饰器

1 中间件使用方法

1.定义中间件

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

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

        response = get_response(request)

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

        return response

    return middleware

实例:

在book子应用中创建文件middleware.py,并定义中间件:

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

2.在settings.py文件中配置我们定义的中间件

  • Django中有一些自带的中间件,在后面添加我们自定义的中间件即可
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',
    'book.middleware.my_middleware',  # 添加中间件
]

3.定义视图并测试:

def test_view(request):
    print('test_view视图代码执行')
    return HttpResponse(f"index, param:{request.body}")

访问这个视图结果:

before request 被调用
test_view视图代码执行
after response 被调用

说明:

  • 就是装饰器的执行原理
  • 中间件中初始化代码在项目启动时执行一次(装饰器初始化代码在模块加载时执行一次)

2.多个中间件的调用顺序

2.1 定义两个中间件,并在settings.py中配置:

中间件:

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

def my_middleware2(get_response):
    print('init 被调用')
    def middleware(request):
        print('before request my_middleware22222被调用')
        response = get_response(request)
        print('after response my_middleware22222被调用')
        return response
    return middleware

配置:

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',
    'book.mw.my_middleware',        # 中间件1
    'book.mw.my_middleware2',       # 中间件2
]

2.2 发送请求,执行结果:

before request my_middleware111111被调用
before request my_middleware22222被调用
test_view视图代码执行
after response my_middleware22222被调用
after response my_middleware111111被调用

说明:中间件1相当于在中间2外面再套一层,其实就是视图上加了多个装饰器

 

posted @ 2021-01-19 20:46  foreast  阅读(93)  评论(0编辑  收藏  举报