Django 基础教程

Django 查询

Django 展示数据

Django Admin

Django 模板

Django 表单组件

Django 高级

Django FAQ

original icon
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.knowledgedict.com/tutorial/django-middleware.html

django 中间件


Django 中间件是一种机制,用于在处理 HTTP 请求和响应的过程中,提供对 Django 框架的访问和控制。它允许你在请求到达视图函数之前和响应返回给客户端之前对请求和响应进行预处理或后处理。中间件可以用于实现一些通用的功能,如身份验证、日志记录、缓存、安全性措施等。接下来,我将详细介绍 Django 中间件的定义、原理、作用、使用方法以及自定义中间件,并结合示例代码进行说明。

中间件的定义

Django 中间件是一个 Python 类,它定义了一组方法,这些方法可以在处理请求和响应的过程中被 Django 框架调用。每个中间件类可以包含以下方法:

  • process_request(self, request) : 在视图函数之前被调用,用于处理请求之前的逻辑。
  • process_view(self, request, view_func, view_args, view_kwargs) : 在视图函数被调用之前被调用,可以对视图函数进行额外的预处理。
  • process_exception(self, request, exception) : 在视图函数抛出异常时被调用,允许处理异常情况。
  • process_template_response(self, request, response) : 在视图函数返回一个 TemplateResponse 对象时被调用,可以对响应进行处理。
  • process_response(self, request, response) : 在响应返回给客户端之前被调用,用于处理响应之前的逻辑。

中间件的原理

Django 中间件基于洋葱模型(Onion Model)的概念。洋葱模型是一种处理流程的设计模式,中间件串联成一个类似洋葱层的结构。请求从外层中间件进入,然后经过每个中间件的处理,直到到达视图函数。然后响应从视图函数返回,再经过每个中间件的处理,最终返回给客户端。中间件的调用顺序是由 MIDDLEWARE 设置中的顺序决定的。

中间件的作用

中间件的作用包括但不限于:

  • 身份验证和授权:检查用户是否登录或具有访问权限。
  • 日志记录:记录请求和响应的信息,用于调试和分析。
  • 缓存:缓存视图函数的响应结果,提高性能。
  • 安全性措施:添加跨站点请求伪造(CSRF)防护等安全功能。
  • 压缩响应:对响应内容进行压缩,减少网络传输的数据量。
  • 国际化和本地化:处理多语言和时区相关的逻辑。

使用方法

  1. 在 Django 项目的 settings.py 文件中,配置中间件列表(MIDDLEWARE ):
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    # Add your custom middleware classes here.
]
  1. 注意,Django 2.x 以及更新版本使用 MIDDLEWARE 设置,而 Django 1.x 使用 MIDDLEWARE_CLASSES 设置,使用时请根据 Django 版本进行相应的设置。

默认的中间件

Django 的默认中间件包括:

django.middleware.security.SecurityMiddleware

这个中间件用于增强应用的安全性。它可以设置一些安全相关的 HTTP 头,如 X-XSS-Protection、X-Content-Type-Options 和 Strict-Transport-Security,以及处理点击劫持攻击的防御。

MIDDLEWARE = [
    # ...
    'django.middleware.security.SecurityMiddleware',
    # ...
]

django.middleware.common.CommonMiddleware

CommonMiddleware 处理一些通用的 HTTP 处理任务。例如,它可以帮助你自动设置"Content-Type"头,使用 HTTP 协议中的 Content-Type 来设置响应的字符集,以及处理 URL 重写。

MIDDLEWARE = [
    # ...
    'django.middleware.common.CommonMiddleware',
    # ...
]

django.middleware.csrf.CsrfViewMiddleware

这个中间件用于防止跨站请求伪造(CSRF)攻击。它会在表单中添加一个 CSRF 令牌,以确保 POST 请求的合法性。

MIDDLEWARE = [
    # ...
    'django.middleware.csrf.CsrfViewMiddleware',
    # ...
]

django.middleware.clickjacking.XFrameOptionsMiddleware

这个中间件用于防止点击劫持攻击。它通过设置"X-Frame-Options"头来限制在其他域名的 Frame 中加载页面。

MIDDLEWARE = [
    # ...
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    # ...
]

django.middleware.gzip.GZipMiddleware

GZipMiddleware 是一个 HTTP 压缩中间件,可以压缩响应内容以减少传输数据的大小,从而提高网站性能。

MIDDLEWARE = [
    # ...
    'django.middleware.gzip.GZipMiddleware',
    # ...
]

django.middleware.locale.LocaleMiddleware

LocaleMiddleware 用于处理国际化和本地化。它根据请求的 Accept-Language 头自动选择适当的语言和时区。

MIDDLEWARE = [
    # ...
    'django.middleware.locale.LocaleMiddleware',
    # ...
]

django.middleware.transaction.TransactionMiddleware

TransactionMiddleware 处理数据库事务。它会在每个请求处理完后自动提交或回滚数据库事务。

MIDDLEWARE = [
    # ...
    'django.middleware.transaction.TransactionMiddleware',
    # ...
]

请注意,Django 的版本可能会更新,并且中间件列表可能会在未来的版本中发生变化。因此,在阅读此示例代码时,最好参考当前使用的 Django 版本的官方文档,以获取最新的中间件列表和信息。

自定义中间件

可以通过创建一个 Python 类来自定义中间件。下面是一个示例代码,展示了一个简单的自定义中间件,它将在每个请求上添加一个自定义 HTTP 头:

# myapp/middleware.py

class CustomHeaderMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        # 在每个请求前添加自定义 HTTP 头
        request.META['X-Custom-Header'] = 'Hello from CustomHeaderMiddleware'

        response = self.get_response(request)

        # 在响应返回前也可以进行处理
        response['X-Custom-Header'] = 'Hello from CustomHeaderMiddleware'

        return response

然后,在 settings.py 文件中,将自定义中间件类添加到 MIDDLEWARE 列表中:

# settings.py

MIDDLEWARE = [
    # ...
    'myapp.middleware.CustomHeaderMiddleware',
    # ...
]

这样,每个请求都会经过 CustomHeaderMiddleware 中间件,并在请求和响应上添加自定义的 HTTP 头。

综上所述,Django 中间件是一个强大的机制,允许你在请求和响应的处理过程中进行自定义逻辑。通过合理使用中间件,你可以轻松地实现各种通用功能,并保持代码的高度复用性。