Python Django中间件原理、流程与实战详解
本文深入解析Django中间件的运行机制与核心流程,详细阐述process_request、process_view等五大关键方法的触发时机与作用。通过具体代码示例,演示如何继承MiddlewareMixin实现IP限制、URL过滤及缓存等常见场景,并对比中间件与装饰器的适用边界,帮助开发者高效构建全局请求处理逻辑。
Django中间件概述
一、什么是Django中间件
Django 中间件是框架层面用于处理请求(request)和响应(response)的钩子机制。作为一个轻量级的插件系统,它允许在全局范围内修改 Django 的输入与输出。每个中间件组件通常负责执行特定的功能任务。
通俗来说,中间件允许开发者在视图函数执行前后插入额外的操作逻辑。它本质上是一个自定义类,其中定义了若干方法,Django 框架会在请求处理的不同阶段自动调用这些方法。
中间件定义规则与核心方法
二、Django中间件的定义规则
1、 自定义中间件的规则
(1)必须继承 MiddlewareMixin 类
from django.utils.deprecation import MiddlewareMixin
(2)需要重写父类提供的方法
父类提供了五个主要方法,其中最核心的是 process_request 和 process_response。
(1)process_request(self, request)
*主要方法。在请求进入并执行视图函数之前调用。(通常无return)
1.中间件的 process_request 方法会在视图函数执行前运行。
2.当配置多个中间件时,它们会按照 MIDDLEWARE 列表中的注册顺序(即索引值),从前到后依次执行。
3.在不同中间件之间传递的 request 对象是同一个实例。
(2)process_view(self, request, view_func, view_args, view_kwargs)
*在 URL 路由匹配成功、但执行视图函数之前调用。此时可以获取视图函数对象及其所有参数。(通常无return)
'''
process_view(self, request, view_func, view_args, view_kwargs)
request是HttpRequest对象。
view_func是Django即将使用的视图函数。 (它是实际的函数对象,而不是函数的名称作为字符串。)
view_args是将传递给视图的位置参数的列表.
view_kwargs是将传递给视图的关键字参数的字典。 view_args和view_kwargs都不包含第一个视图参数(request)。
'''
(3)process_template_response(self, request, response)
*较少使用。在视图函数调用 render() 渲染方法后调用。(有return)
(4)process_exception(self, request, exception)
当视图函数执行过程中抛出异常时调用。(通常无return)
*该方法接收两个参数:
一个是 HttpResponse 对象
另一个是视图函数产生的 exception 异常对象
此函数仅在视图函数抛出异常时才会执行。它返回 None 或 HttpResponse 对象。如果返回 HttpResponse 对象,Django 将调用模板及中间件中的 process_response 方法,并将结果返回给浏览器;否则默认处理异常。若返回 None,则交由下一个中间件的 process_exception 方法处理,其执行顺序遵循中间件注册顺序的倒序。
(5)process_response(self, request, response)
主要方法。在视图函数执行完毕并生成响应后调用。(有return)
返回值可以是 None 或 HttpResponse 对象。如果返回 None,则继续按照 Django 定义的流程向下执行,交由下一个中间件处理;如果返回 HttpResponse 对象,Django 将不再执行视图函数,而是直接将该对象返回给用户。
(3)将自定义中间件类添加到 settings.py 文件中的 MIDDLEWARE 配置项里
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',
# 自定义 在对应app内创建一个 my_middleware.py文件,然后定义类名为Middleware的中间件
'app.my_middleware.Middleware',
]
# 白名单路径,不需要做登陆就能访问的页面
WHITE_LIST = ['/login/', '/logout/']
MIDDLEWARE 是一个列表,其中的元素是字符串形式的类路径,代表具体的中间件。
代码实现示例
三、代码实现
my_middleware.py
from django.utils.deprecation import MiddlewareMixin # 导入中间间模块
from django.shortcuts import redirect # 返回页面模块
from middlewareDemo import settings # 导入白名单
class Middleware(MiddlewareMixin): # 认证中间件
def process_request(self, request):
"""
请求来之前判断是否已经登录
:param request:
:return:
"""
white_list = settings.WHITE_LIST
if request.path in white_list:
return None # 如果是白名单的路径,直接跳过
if not request.user.is_authenticated: # 获取用户是否登陆
return redirect('/login/')
def process_response(self, request, response):
"""
不管是何执行结果,都会返回相应的HttpResonse对象
:param request:
:param response:
:return:
"""
print('m1.process_response')
return response
def process_exception(self, request, exception):
"""
出现异常才会被调用进行异常处理
:param request:
:param exception:
:return:
"""
print('m1.process_exception')
常见应用场景
四、中间件的使用场景
1.做IP限制
将特定 IP 放在中间件列表中,以阻止某些 IP 访问。
2.URL访问过滤
例如,如果用户访问的是 logo 视图(通常设为放行)。
若访问其他视图,需检测是否已有 session。若存在则放行,否则返回 login 页面。这样可以避免在多个视图函数上重复编写装饰器。
3.缓存
当客户端请求到达时,中间件先检查缓存中是否有数据。若有,直接返回给用户;若无,再交由逻辑层执行视图函数。
4、CSRF
Django 项目默认启用 CSRF 保护,每次请求时通过 CSRF 中间件检查请求中是否包含正确的 token 值。
中间件与装饰器的区别
五、Django中间件与装饰器的区别
1、Django 中间件:在视图函数执行前进行预处理,并在执行后进行收尾工作。它不区分具体视图,对所有视图一视同仁,统一执行前置处理或后置处理。
Django 创建时默认内置了 6 个中间件(如 session 和 csrf)。在视图函数执行前进行的处理,既可以使用装饰器,也可以使用中间件。
2、装饰器:主要区别在于作用域。如果在视图函数上添加装饰器,它能保证该视图方法在执行前后被执行,但仅适用于添加了装饰器的特定视图。
若需进行不区分视图的普遍处理,应使用 middleware 以避免编写重复代码。中间件本质上是一个自定义类,其中定义了几个方法,Django 框架会在请求的特定阶段自动执行这些方法。
例如,可用于登录时的黑名单验证。
如果需要对特殊视图进行单独处理,建议使用装饰器。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









