【Django】中心件

[复制链接]
发表于 2025-9-17 07:57:07 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
Django 中心件是 Django 框架里一个轻量级、可插拔的组件,它能在全局范围内对 Django 的哀求和相应举行处置惩罚。中心件处于 Django 的哀求处置惩罚流程之中,在哀求抵达视图函数之前以及视图函数返反相应之后执行特定操作。以下是关于 Django 中心件的详细先容:
一、详细先容

工作原理

Django 中心件的工作流程是一个哀求/相应处置惩罚的管道。当一个哀求到达 Django 项目时,它会依次颠末每个中心件的处置惩罚,这些处置惩罚大概包罗对哀求举行预处置惩罚、身份验证、日记纪录等。在视图函数处置惩罚完哀求并返反相应后,相应会再次颠末中心件,不过这次是反向次序,中心件可以对相应举行后处置惩罚,如添加相应头、压缩相应内容等。
中心件的作用


  • 全局哀求处置惩罚:可以对全部哀求举行预处置惩罚,比方验证用户身份、查抄哀求泉源等。
  • 全局相应处置惩罚:对全部相应举行后处置惩罚,如添加通用的相应头、压缩相应内容等。
  • 非常处置惩罚:捕捉视图函数中抛出的非常,并举行同一处置惩罚。
  • 性能监控监控:纪录哀求的处置惩罚时间,方便举行性能分析。
中心件的利用场景


  • 身份验证和授权:在哀求到达视图之前验证用户身份,确保只有授权用户可以访问某些视图。
  • 日记纪录:纪录每个哀求的详细信息,如哀求时间、哀求路径、哀求参数等,方便后续的调试和分析。
  • 缓存控制:设置相应头,控制欣赏器和缓存服务器对相应的缓存战略。
  • 跨域资源共享(CORS):处置惩罚跨域哀求,答应差别域名的页面访问当前网站的资源。
中心件的实现方式

在 Django 中,中心件可以通过以下几种方式实现:
函数式中心件

函数式中心件是最简朴的中心件实现方式,它是一个接受 get_response 函数作为参数的函数,返回一个新的函数,该函数处置惩罚哀求和相应。
  1. def simple_middleware(get_response):
  2.     def middleware(request):
  3.         # 请求处理前的逻辑
  4.         print("Before view is called")
  5.         response = get_response(request)
  6.         # 请求处理后的逻辑
  7.         print("After view is called")
  8.         return response
  9.     return middleware
复制代码
类式中心件

类式中心件是更机动的实现方式,它通过界说一个类来实现中心件的功能。类中必要实现 __init__ 和 __call__ 方法。
  1. class SimpleMiddleware:
  2.     def __init__(self, get_response):
  3.         self.get_response = get_response
  4.     def __call__(self, request):
  5.         # 请求处理前的逻辑
  6.         print("Before view is called")
  7.         response = self.get_response(request)
  8.         # 请求处理后的逻辑
  9.         print("After view is called")
  10.         return response
复制代码
中心件的配置

要利用自界说的中心件,必要将其添加到 Django 项目标 settings.py 文件中的 MIDDLEWARE 设置中。中心件的次序很紧张,哀求会按照 MIDDLEWARE 列表中的次序依次颠末每个中心件,而相应则会按照相反的次序颠末中心件。
  1. MIDDLEWARE = [
  2.     # 其他中间件...
  3.     'myapp.middleware.SimpleMiddleware',
  4. ]
复制代码
内置中心件

Django 提供了一些内置的中心件,这些中心件可以直接在项目中利用,常见的内置中心件包罗:

  • django.middleware.security.SecurityMiddleware:提供一些根本的安全功能,如安全头设置、HTTP 严酷传输安全(HSTS)等。
  • django.contrib.sessions.middleware.SessionMiddleware:处分析话功能,答应在差别哀求之间存储和访问用户数据。
  • django.contrib.auth.middleware.AuthenticationMiddleware:将用户对象附加到每个哀求上,方便在视图中利用 request.user 来获取当前用户。
  • django.middleware.csrf.CsrfViewMiddleware:提供跨站哀求伪造(CSRF)掩护。
通过利用中心件,你可以在不修改视图函数的环境下,对整个 Django 项目标哀求和相应举行同一处置惩罚,进步代码的可维护性和复用性。

二、多个中心件的执行次序

Django 中心件的执行次序是明白其工作原理的关键部分,下面为你详细且形象地先容多个中心件的执行次序。
团体流程概述

当一个哀求进入 Django 应用时,它会像一个“观光者”一样,依次颠末 MIDDLEWARE 设置列表里的各个中心件,这个过程就像是观光者依次穿过差别的“关卡”。在每个关卡,中心件可以对哀求举行查抄、修改等操作。当哀求到达视图函数并得到相应后,相应又会沿着相反的方向,再次穿过这些“关卡”,只不过这次是从末了一个中心件开始,逐个往前处置惩罚,每个中心件可以对相应举行后处置惩罚。
执行次序的形象比喻

假设你要去一个神秘的城堡参观,这个城堡有很多道“魔法门”,每道魔法门都有差别的魔法结果,这些魔法门就相当于 Django 中的中心件。
哀求阶段

当你从城堡外走向城堡内部(哀求进入)时,你必要依次穿过这些魔法门。每穿过一道门,门的魔法就会作用在你身上,好比给你一个特殊的标记、查抄你的身份等。这个过程就犹如哀求依次颠末 MIDDLEWARE 列表中的中心件,每个中心件对哀求举行预处置惩罚。
视图处置惩罚阶段

当你穿过全部的魔法门后,就进入了城堡的焦点地区(视图函数),在这里你可以完成你的参观任务(处置惩罚哀求),并得到一些纪念品(生成相应)。
相应阶段

当你参观竣事,要离开城堡时,你必要再次穿过这些魔法门,但这次是反向的。每穿过一道门,魔法门又会对你身上的纪念品举行一些处置惩罚,好比给纪念品添加一个封印、改变纪念品的表面等。这个过程就犹如相应依次颠末中心件,每个中心件对相应举行后处置惩罚。
代码示例与执行次序阐明

假设我们有三个中心件 MiddlewareA、MiddlewareB 和 MiddlewareC,而且在 settings.py 中的 MIDDLEWARE 设置如下:
  1. MIDDLEWARE = [
  2.     'myapp.middleware.MiddlewareA',
  3.     'myapp.middleware.MiddlewareB',
  4.     'myapp.middleware.MiddlewareC',
  5. ]
复制代码
下面是这三个中心件的简朴实现:
  1. # myapp/middleware.py
  2. class MiddlewareA:
  3.     def __init__(self, get_response):
  4.         self.get_response = get_response
  5.     def __call__(self, request):
  6.         print("MiddlewareA: Before view")
  7.         response = self.get_response(request)
  8.         print("MiddlewareA: After view")
  9.         return response
  10. class MiddlewareB:
  11.     def __init__(self, get_response):
  12.         self.get_response = get_response
  13.     def __call__(self, request):
  14.         print("MiddlewareB: Before view")
  15.         response = self.get_response(request)
  16.         print("MiddlewareB: After view")
  17.         return response
  18. class MiddlewareC:
  19.     def __init__(self, get_response):
  20.         self.get_response = get_response
  21.     def __call__(self, request):
  22.         print("MiddlewareC: Before view")
  23.         response = self.get_response(request)
  24.         print("MiddlewareC: After view")
  25.         return response
复制代码
当一个哀求到达时,控制台的输出次序如下:
  1. MiddlewareA: Before view
  2. MiddlewareB: Before view
  3. MiddlewareC: Before view
  4. # 视图函数处理请求
  5. MiddlewareC: After view
  6. MiddlewareB: After view
  7. MiddlewareA: After view
复制代码
从输出可以看出,哀求按照 MIDDLEWARE 列表中的次序依次颠末 MiddlewareA、MiddlewareB 和 MiddlewareC 的“哀求预处置惩罚”部分,然后进入视图函数处置惩罚哀求。视图函数返反相应后,相应按照相反的次序颠末 MiddlewareC、MiddlewareB 和 MiddlewareA 的“相应后处置惩罚”部分。
次序的紧张性

中心件的次序非常紧张,由于它会影响到中心件的执行结果。比方,身份验证中心件通常必要放在其他必要用户身份信息的中心件之前,如许才能确保在后续中心件执行时,用户身份已履历证通过。假如次序设置不妥,大概会导致中心件无法正常工作,或者出现安全毛病。
综上所述,明白 Django 中心件的执行次序对于精确利用中心件和构建高效的 Django 应用至关紧张。

三、MiddlewareMixin

MiddlewareMixin 是 Django 框架里的一个实用工具类,它的重要作用是简化中心件的创建过程。下面从多个方面对其举行详细先容。
用途

在 Django 早期版本中,创建中心件的方式较为复杂,必要手动处置惩罚中心件的初始化和哀求相应的调用逻辑。而 MiddlewareMixin 则是 Django 为了简化中心件的编写而引入的一个基类,借助它可以或许更便捷地创建中心件。
工作原理

MiddlewareMixin 是一个实现了特定逻辑的基类,它提供了中心件所需的根本结构。当你让自界说中心件继续自 MiddlewareMixin 时,就能利用其已经实现好的初始化和哀求相应处置惩罚逻辑,从而淘汰代码量。
利用方法

以下是利用 MiddlewareMixin 创建中心件的示例:
  1. from django.utils.deprecation import MiddlewareMixin
  2. class SimpleMiddleware(MiddlewareMixin):
  3.     def process_request(self, request):
  4.         # 请求处理前的逻辑
  5.         print("Before view is called")
  6.     def process_response(self, request, response):
  7.         # 请求处理后的逻辑
  8.         print("After view is called")
  9.         return response
复制代码
在这个例子里,SimpleMiddleware 继续自 MiddlewareMixin,而且实现了两个方法:

  • process_request(request):此方法会在哀求到达视图之前被调用,可用于对哀求举行预处置惩罚,像验证用户身份、纪录哀求日记等操作。
  • process_response(request, response):该方法会在视图返反相应之后被调用,可用于对相应举行后处置惩罚,好比添加相应头、压缩相应内容等操作。
完备示例

假设你要在项目中利用这个中心件,必要完成以下步骤:

  • 创建中心件文件:在你的应用(比方 myapp)下创建一个 middleware.py 文件,并把上述中心件代码添加进去。
  • 配置中心件:在 settings.py 文件的 MIDDLEWARE 设置里添加自界说中心件的路径。
  1. MIDDLEWARE = [
  2.     # 其他中间件...
  3.     'myapp.middleware.SimpleMiddleware',
  4. ]
复制代码
留意事项


  • Django 版本差别:在 Django 1.10 及之后的版本中,MiddlewareMixin 被用来兼容旧的中心件写法。从 Django 2.0 开始,中心件可以通过实现 __call__ 方法来创建,这种方式更为简便。示比方下:
  1. class NewStyleMiddleware:
  2.     def __init__(self, get_response):
  3.         self.get_response = get_response
  4.     def __call__(self, request):
  5.         # 请求处理前的逻辑
  6.         print("Before view is called")
  7.         response = self.get_response(request)
  8.         # 请求处理后的逻辑
  9.         print("After view is called")
  10.         return response
复制代码

  • 执行次序:中心件的执行次序由 MIDDLEWARE 设置列表中的次序决定。哀求会按照列表次序依次颠末各个中心件的 process_request 方法,而相应则会按照相反次序颠末各个中心件的 process_response 方法。
总结

MiddlewareMixin 是 Django 提供的一个用于简化中心件编写的工具类,它让开发者可以通过实现 process_request 和 process_response 方法来创建中心件。不过,随着 Django 版本的更新,新的中心件创建方式渐渐盛行,你可以根据项目需求和 Django 版本选择符合的方式。
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表