当前位置:首页 > 技术 > 正文内容

Django 中间件机制详解与实战应用

访客 技术 2026年7月11日 2

中间件概述

Django 中间件是处理请求(request)和响应(response)之间逻辑的钩子框架,它允许你在视图函数执行前后插入自定义处理逻辑。中间件以全局方式作用于整个项目,因此在提升功能灵活性的同时,也需注意其对系统性能的影响。

默认中间件配置

在 Django 项目的 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',
]
  • SecurityMiddleware:提供安全防护,如强制 HTTPS、设置安全响应头。
  • SessionMiddleware:启用会话支持。
  • CommonMiddleware:处理常见 HTTP 行为,如 URL 规范化。
  • CsrfViewMiddleware:防止跨站请求伪造攻击。
  • AuthenticationMiddleware:将用户绑定到请求对象。
  • MessageMiddleware:支持一次性消息传递。
  • XFrameOptionsMiddleware:防止页面被嵌入 iframe,抵御点击劫持。

中间件核心方法

Django 中间件包含四个可选方法,按执行顺序如下:

  1. process_request(request)
  2. process_view(request, view_func, view_args, view_kwargs)
  3. process_exception(request, exception)
  4. process_response(request, response)

1. process_request 与 process_response

这两个方法分别在请求进入和响应返回时触发。

  • process_request 接收 request 对象,无返回值或返回 HttpResponse 对象。
  • process_response 必须返回一个 response 对象,通常原样返回或修改后返回。

示例代码

创建两个自定义中间件类:

from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse

class AuthCheckMiddleware(MiddlewareMixin):
    def process_request(self, request):
        print("认证检查中间件 - 请求开始")

    def process_response(self, request, response):
        print("认证检查中间件 - 响应结束")
        return response

class LoggingMiddleware(MiddlewareMixin):
    def process_request(self, request):
        print("日志记录中间件 - 请求捕获")

    def process_response(self, request, response):
        print("日志记录中间件 - 响应发送")
        return response

注册中间件(在 settings.py 中):

MIDDLEWARE += [
    'myapp.middleware.AuthCheckMiddleware',
    'myapp.middleware.LoggingMiddleware',
]

输出结果:

认证检查中间件 - 请求开始
日志记录中间件 - 请求捕获
[视图函数执行]
日志记录中间件 - 响应发送
认证检查中间件 - 响应结束

说明:请求阶段从上到下依次执行,响应阶段则逆序执行。

2. process_view

该方法在确定要调用哪个视图函数之后、实际调用之前执行。

def process_view(self, request, view_func, view_args, view_kwargs)
  • view_func:即将执行的视图函数。
  • view_args/view_kwargs:传递给视图的位置参数和关键字参数。

使用场景示例

class ViewMonitorMiddleware(MiddlewareMixin):
    def process_view(self, request, view_func, view_args, view_kwargs):
        print(f"准备执行视图: {view_func.__name__}")
        # 可在此处实现权限判断、API 调用统计等

process_view 返回 HttpResponse,则跳过后续所有 process_view 和视图函数,直接进入 response 阶段。

3. process_exception

仅在视图抛出异常时调用:

def process_exception(self, request, exception):
    print(f"捕获异常: {exception}")
    return HttpResponse("服务器内部错误", status=500)

此方法可用于统一异常处理、日志记录、错误页面展示等。

自定义中间件实现登录拦截

以下中间件实现免登录路径放行与未登录跳转:

class LoginRequiredMiddleware(MiddlewareMixin):
    def process_request(self, request):
        allowed_paths = ['/login/', '/register/', '/static/']
        if any(request.path.startswith(path) for path in allowed_paths):
            return None  # 放行

        if not request.user.is_authenticated:
            return HttpResponse("请先登录", status=401)

        return None  # 继续处理

增强安全性:CORS 与安全头设置

通过中间件统一设置安全响应头:

class SecurityHeaderMiddleware(MiddlewareMixin):
    def process_response(self, request, response):
        # CORS 设置
        response['Access-Control-Allow-Origin'] = 'https://trusted-site.com'
        response['Access-Control-Allow-Methods'] = 'GET, POST, OPTIONS'
        response['Access-Control-Allow-Headers'] = 'Content-Type, Authorization'

        # 安全头
        response['X-Content-Type-Options'] = 'nosniff'
        response['X-Frame-Options'] = 'DENY'
        response['X-XSS-Protection'] = '1; mode=block'
        response['Strict-Transport-Security'] = 'max-age=31536000; includeSubDomains'
        response['Referrer-Policy'] = 'strict-origin-when-cross-origin'
        response['Content-Security-Policy'] = "default-src 'self'; script-src 'self'"

        return response

执行流程图解

中间件执行遵循"洋葱模型":

  1. 请求进入 → 执行各中间件的 process_request(顺序执行)
  2. → 执行 process_view(顺序执行)
  3. → 调用视图函数
  4. → 视图返回或抛出异常
  5. → 若异常 → 执行 process_exception(逆序)
  6. → 执行 process_response(逆序)
  7. → 返回客户端

注意事项

  • 中间件顺序影响执行逻辑,应合理排列。
  • 避免在中间件中进行耗时操作,以免阻塞请求。
  • 返回 HttpResponse 会中断后续中间件和视图执行。
  • 生产环境建议关闭调试信息输出。

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。