Django中间件介绍

328 阅读5分钟

Django-Middleware

Django中间件简介

中间件必须把每一个请求和响应拉到Web应用程序中,并对请求和响应进行中间件的处理。简单来说,这些中间件组件只不过是一个python类;这些中间件元素被称为组件;这些组件中的每一个都负责执行一些操作。这些组件在settings.py文件的python列表变量MIDDLEWARE中被表示为字符串。中间件组件可以在应用程序中的任何路径中声明,唯一需要确保的是该路径是否在settings.py文件中的中间件元组中声明。在本主题中,我们将学习Django中间件。

中间件的激活

通过在settings.py文件的MIDDLEWARE列表中提到中间件项目,可以激活一个中间件。下面提到的列表持有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',

下面将解释以上列出的默认中间件在Django框架中的必要性和用途。

默认的中间件操作描述
djangosecure.middleware.SecurityMiddlewareX-Frame-Options:DENY限制显示的页面必须在一个框架内。
HTTP严格传输安全设置这个允许网站只在HTTPS而不是HTTP上被浏览器访问。
X-Content-Type-Options: nosniff这个选项有助于防止MIME嗅探漏洞。
X-XSS-Protection:1; mode=block当检测到XSS(跨站脚本)攻击时,它会阻止网站页面进一步加载。
SSL重定向这将把所有的http连接重定向到https连接。
检测代理的SSL在少数情况下,request.is_secure()方法对有效请求返回错误;设置该选项将有助于为安全的外部连接设置一个替代头。
django.middleware.common.CommonMiddleware根据APPEND_SLASH和PREPEND_WWW设置重写URL。当APPEND_SLASH为 "true "时,如果URL没有"/",那么新的URL将在URL的末尾有一个斜线。报道中提到的用户的访问权限
限制DISALLOWED_USER_AGENTS设置中所列用户的访问。
django.contrib.session.middleware.SessionMiddleware当会话中间件被激活时,每个 HttpRequest 对象都会有一个会话属性作为第一个参数被标记。这是一个字典类型的对象,会话值可以使用request.Middleware插入这个字典对象中。在视图文件的任何地方插入session。
django.middleware.csrf.CsrfViewMiddleware这个中间件选项允许保护所有的跨站请求伪造行为。
django.contrib.auth.middleware.AuthenticationMiddleware设置该中间件选项可以将当前登录的用户添加到每个进入的httpRequest对象中。
django.contrib.messages.middleware.MessageMiddleware这个中间件将处理网站和网络浏览器之间的所有临时消息。
django.middleware.clickjacking.XFrameOptionsMiddleware将显示的页面限制在一个框架内。

中间件在Django中是如何工作的?

以下是Django中中间件的工作要点。

  • 中间件组件的声明顺序是非常重要的。
  • 中间件类在请求/响应生命周期中被执行两次。
  • 在请求过程中,这些类是按照从上到下的顺序执行的。
  • 在响应过程中,这些类从下到上被执行。这就是为什么组件的顺序非常重要。
  • 在服务器的启动过程中,_init_方法被执行。
  • _call__方法在每个请求中都会被执行。

中间件中的强制性方法

下面列出的方法中,至少有一个必须作为中间件的一部分被声明。

  • 如果中间件需要在请求期间进行处理。
    • process_request(request)
    • process_view(request, view_func, view_args, view_kwargs)
  • 如果中间件需要在响应期间进行处理。
    • process_exception(request, exception) (只有当视图引发异常时)
    • process_template_response(request, response) (只针对模板响应)
    • process_response(request, response)

自定义中间件

对于设置自定义中间件的设置,需要遵循下面提到的步骤;这个自定义中间件将是一个用户定义的中间件,停留在中间,对传递的请求和响应信息进行所需的或指导性的处理。自定义中间件为中间件服务提供了极大的灵活性。所以这些自定义级别的中间件服务在Django中间件设置中扮演着非常重要的角色。此外,内置的中间件服务的属性也可以在几个可能的范围内进行调制,以达到中间件的能力。

1.1.在项目的任何地方放置一个名为middleware.py的文件。按照Django的设置,这个中间件文件放在什么位置并不是什么大问题。重要的是确保该文件的路径在settings.py文件的中间件列表中被准确提及。这是最重要的因素。

2.在middleware.py文件中放置中间件的类。这是这个过程中最重要的一步;由于中间件的执行顺序是很重要的,所以必须确保新添加的中间件项目被放在中间件列表的最后一个元素。同时,需要严格确保中间件项目是字符串格式的。

middleware.py:

class NewMiddleware: def __init__(self, get_request): self.get_request = get_request def __call__(self, request): request = self.get_request(request) print("The Newly installed middleware is successfully triggered!!!") return request

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', # Userdefined Middleware 'Django_app1.middleware.NewMiddleware', ]

从上述条目可以判断,middleware.py文件是放在Django_app1文件夹里面的,该文件里面有一个名为NewMiddleware的中间件类作为实例。如果在middleware.py文件中还需要安装几个新的中间件,那么就必须为所有这些中间件单独放置条目。

3.使用python manage.py runserver命令重新加载服务器,并验证网页。

Django Middleware output 1

Django Middleware output 2

一旦服务器被加载,并且收到来自网页的任何请求,屏幕上就会显示提到 "新安装的中间件被成功触发了!!"的中间信息。这证明了新安装的中间件正在按预期工作。