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 @   foreast  阅读(101)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示