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外面再套一层,其实就是视图上加了多个装饰器
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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语句:使用策略模式优化代码结构