马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
Django 中心件是 Django 框架里一个轻量级、可插拔的组件,它能在全局范围内对 Django 的哀求和相应举行处置惩罚。中心件处于 Django 的哀求处置惩罚流程之中,在哀求抵达视图函数之前以及视图函数返反相应之后执行特定操作。以下是关于 Django 中心件的详细先容:
一、详细先容
工作原理
Django 中心件的工作流程是一个哀求/相应处置惩罚的管道。当一个哀求到达 Django 项目时,它会依次颠末每个中心件的处置惩罚,这些处置惩罚大概包罗对哀求举行预处置惩罚、身份验证、日记纪录等。在视图函数处置惩罚完哀求并返反相应后,相应会再次颠末中心件,不过这次是反向次序,中心件可以对相应举行后处置惩罚,如添加相应头、压缩相应内容等。
中心件的作用
- 全局哀求处置惩罚:可以对全部哀求举行预处置惩罚,比方验证用户身份、查抄哀求泉源等。
- 全局相应处置惩罚:对全部相应举行后处置惩罚,如添加通用的相应头、压缩相应内容等。
- 非常处置惩罚:捕捉视图函数中抛出的非常,并举行同一处置惩罚。
- 性能监控
:纪录哀求的处置惩罚时间,方便举行性能分析。
中心件的利用场景
- 身份验证和授权:在哀求到达视图之前验证用户身份,确保只有授权用户可以访问某些视图。
- 日记纪录:纪录每个哀求的详细信息,如哀求时间、哀求路径、哀求参数等,方便后续的调试和分析。
- 缓存控制:设置相应头,控制欣赏器和缓存服务器对相应的缓存战略。
- 跨域资源共享(CORS):处置惩罚跨域哀求,答应差别域名的页面访问当前网站的资源。
中心件的实现方式
在 Django 中,中心件可以通过以下几种方式实现:
函数式中心件
函数式中心件是最简朴的中心件实现方式,它是一个接受 get_response 函数作为参数的函数,返回一个新的函数,该函数处置惩罚哀求和相应。- def simple_middleware(get_response):
- def middleware(request):
- # 请求处理前的逻辑
- print("Before view is called")
- response = get_response(request)
- # 请求处理后的逻辑
- print("After view is called")
- return response
- return middleware
复制代码 类式中心件
类式中心件是更机动的实现方式,它通过界说一个类来实现中心件的功能。类中必要实现 __init__ 和 __call__ 方法。- class SimpleMiddleware:
- def __init__(self, get_response):
- self.get_response = get_response
- def __call__(self, request):
- # 请求处理前的逻辑
- print("Before view is called")
- response = self.get_response(request)
- # 请求处理后的逻辑
- print("After view is called")
- return response
复制代码 中心件的配置
要利用自界说的中心件,必要将其添加到 Django 项目标 settings.py 文件中的 MIDDLEWARE 设置中。中心件的次序很紧张,哀求会按照 MIDDLEWARE 列表中的次序依次颠末每个中心件,而相应则会按照相反的次序颠末中心件。- MIDDLEWARE = [
- # 其他中间件...
- 'myapp.middleware.SimpleMiddleware',
- ]
复制代码 内置中心件
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 设置如下:- MIDDLEWARE = [
- 'myapp.middleware.MiddlewareA',
- 'myapp.middleware.MiddlewareB',
- 'myapp.middleware.MiddlewareC',
- ]
复制代码 下面是这三个中心件的简朴实现:- # myapp/middleware.py
- class MiddlewareA:
- def __init__(self, get_response):
- self.get_response = get_response
- def __call__(self, request):
- print("MiddlewareA: Before view")
- response = self.get_response(request)
- print("MiddlewareA: After view")
- return response
- class MiddlewareB:
- def __init__(self, get_response):
- self.get_response = get_response
- def __call__(self, request):
- print("MiddlewareB: Before view")
- response = self.get_response(request)
- print("MiddlewareB: After view")
- return response
- class MiddlewareC:
- def __init__(self, get_response):
- self.get_response = get_response
- def __call__(self, request):
- print("MiddlewareC: Before view")
- response = self.get_response(request)
- print("MiddlewareC: After view")
- return response
复制代码 当一个哀求到达时,控制台的输出次序如下:- MiddlewareA: Before view
- MiddlewareB: Before view
- MiddlewareC: Before view
- # 视图函数处理请求
- MiddlewareC: After view
- MiddlewareB: After view
- MiddlewareA: After view
复制代码 从输出可以看出,哀求按照 MIDDLEWARE 列表中的次序依次颠末 MiddlewareA、MiddlewareB 和 MiddlewareC 的“哀求预处置惩罚”部分,然后进入视图函数处置惩罚哀求。视图函数返反相应后,相应按照相反的次序颠末 MiddlewareC、MiddlewareB 和 MiddlewareA 的“相应后处置惩罚”部分。
次序的紧张性
中心件的次序非常紧张,由于它会影响到中心件的执行结果。比方,身份验证中心件通常必要放在其他必要用户身份信息的中心件之前,如许才能确保在后续中心件执行时,用户身份已履历证通过。假如次序设置不妥,大概会导致中心件无法正常工作,或者出现安全毛病。
综上所述,明白 Django 中心件的执行次序对于精确利用中心件和构建高效的 Django 应用至关紧张。
三、MiddlewareMixin
MiddlewareMixin 是 Django 框架里的一个实用工具类,它的重要作用是简化中心件的创建过程。下面从多个方面对其举行详细先容。
用途
在 Django 早期版本中,创建中心件的方式较为复杂,必要手动处置惩罚中心件的初始化和哀求相应的调用逻辑。而 MiddlewareMixin 则是 Django 为了简化中心件的编写而引入的一个基类,借助它可以或许更便捷地创建中心件。
工作原理
MiddlewareMixin 是一个实现了特定逻辑的基类,它提供了中心件所需的根本结构。当你让自界说中心件继续自 MiddlewareMixin 时,就能利用其已经实现好的初始化和哀求相应处置惩罚逻辑,从而淘汰代码量。
利用方法
以下是利用 MiddlewareMixin 创建中心件的示例:- from django.utils.deprecation import MiddlewareMixin
- class SimpleMiddleware(MiddlewareMixin):
- def process_request(self, request):
- # 请求处理前的逻辑
- print("Before view is called")
- def process_response(self, request, response):
- # 请求处理后的逻辑
- print("After view is called")
- return response
复制代码 在这个例子里,SimpleMiddleware 继续自 MiddlewareMixin,而且实现了两个方法:
- process_request(request):此方法会在哀求到达视图之前被调用,可用于对哀求举行预处置惩罚,像验证用户身份、纪录哀求日记等操作。
- process_response(request, response):该方法会在视图返反相应之后被调用,可用于对相应举行后处置惩罚,好比添加相应头、压缩相应内容等操作。
完备示例
假设你要在项目中利用这个中心件,必要完成以下步骤:
- 创建中心件文件:在你的应用(比方 myapp)下创建一个 middleware.py 文件,并把上述中心件代码添加进去。
- 配置中心件:在 settings.py 文件的 MIDDLEWARE 设置里添加自界说中心件的路径。
- MIDDLEWARE = [
- # 其他中间件...
- 'myapp.middleware.SimpleMiddleware',
- ]
复制代码 留意事项
- Django 版本差别:在 Django 1.10 及之后的版本中,MiddlewareMixin 被用来兼容旧的中心件写法。从 Django 2.0 开始,中心件可以通过实现 __call__ 方法来创建,这种方式更为简便。示比方下:
- class NewStyleMiddleware:
- def __init__(self, get_response):
- self.get_response = get_response
- def __call__(self, request):
- # 请求处理前的逻辑
- print("Before view is called")
- response = self.get_response(request)
- # 请求处理后的逻辑
- print("After view is called")
- return response
复制代码
- 执行次序:中心件的执行次序由 MIDDLEWARE 设置列表中的次序决定。哀求会按照列表次序依次颠末各个中心件的 process_request 方法,而相应则会按照相反次序颠末各个中心件的 process_response 方法。
总结
MiddlewareMixin 是 Django 提供的一个用于简化中心件编写的工具类,它让开发者可以通过实现 process_request 和 process_response 方法来创建中心件。不过,随着 Django 版本的更新,新的中心件创建方式渐渐盛行,你可以根据项目需求和 Django 版本选择符合的方式。
|