深入理解 Django 中间件:内置与自定义指南

源内容(英文)

Django 中的中间件充当位于 Web 服务器和视图之间的轻量级组件。它们全局处理请求和响应,有助于管理常见任务,而不会使视图代码变得复杂。

  • 将可重用的功能(例如 CSRF 保护)封装到独立的组件中。
  • 自动应用于所有传入请求和传出响应。
  • 同时支持基于类和基于函数的中间件风格。
  • 处理跨领域任务,如身份验证、安全标头和会话管理。
  • 适用于强制执行 HTTPS、压缩响应或记录性能等全局操作。

中间件的工作原理

Django 在请求-响应周期的多个阶段集成中间件:

!httprequestDjango Middleware

1. 请求阶段: 请求按照 MIDDLEWARE 设置中定义的顺序(从上到下)通过每个中间件。中间件可以:

  • 检查或修改请求。
  • 通过提前返回 HttpResponse 来中断处理。
  • 返回 None 以继续处理。

2. URL 解析和视图处理: 在通过中间件堆栈后,请求到达 Django 的 URL 解析器,后者执行匹配的视图函数或基于类的视图以生成响应。
3. 响应阶段: 响应以相反的顺序(从下到上)通过中间件堆栈传回。中间件可以:

  • 修改响应(例如,添加标头)。
  • 向上游返回修改后的响应。

4. 异常处理(可选):

如果在视图处理期间发生异常,中间件中的 process_exception 钩子可以在响应阶段之前介入。

这种结构确保中间件可以在请求-响应生命周期的多个点注入功能,同时保持模块化、可重用,并与单个视图解耦。

Django 中的中间件钩子

钩子是 Django 中间件中的特殊方法,在请求-响应周期期间的特定点调用。它们允许以模块化和可重用的方式检查、修改或中断请求和响应。

  • process_request(request): 在视图执行之前运行。可以检查或修改请求。在此处返回 HttpResponse 将停止进一步处理。
  • processview(request, viewfunc, viewargs, viewkwargs): 在 URL 解析之后但在视图执行之前运行。对于执行特定于视图的检查或修改很有用。
  • processtemplateresponse(request, response): 在视图返回 TemplateResponse 之后运行。允许在渲染之前调整模板或上下文。
  • process_exception(request, exception): 如果视图引发异常则调用。可以处理异常并返回自定义响应。
  • processresponse(request, response): 在视图返回响应之后(或在 processexception 之后)运行。允许在将响应发送回客户端之前进行最终修改

Django 中间件的类型

Django 的中间件可分为 2 种类型:内置自定义

内置 Django 中间件

Django 包含一组强大的内置中间件类,在新项目中默认启用。以下是包括其用途和关键设置在内的全面概述:

中间件类

用途

关键设置 —

— SecurityMiddleware

添加安全标头(例如 HSTS、X-Content-Type-Options);将 HTTP 重定向到 HTTPS。

SECUREHSTSSECONDS, SECURESSLREDIRECT. 在生产环境中使用。 SessionMiddleware

启用会话处理;将会话数据附加到请求。

需要 SESSION_ENGINE; 放置在 AuthenticationMiddleware 之前。 CsrfViewMiddleware

通过验证 POST/PUT/DELETE 请求中的令牌来防止 CSRF 攻击。

CSRFTRUSTEDORIGINS; 使用 @csrf_exempt 豁免视图。 XFrameOptionsMiddleware

通过设置 X-Frame-Options 标头来防止点击劫持。

XFRAMEOPTIONS (例如 ‘DENY‘). CommonMiddleware

处理条件 GET 的 ETags、尾部斜杠/www 的重定向以及 gzip 压缩提示。

APPENDSLASH, USEETAGS. 放置在 GZipMiddleware 之前。 AuthenticationMiddleware

填充 request.user; 需要会话。

放置在 SessionMiddleware 之后。 MessageMiddleware

将消息(例如来自 messages.success())附加到请求以供显示。

与 django.contrib.messages 一起使用。 FetchFromCacheMiddleware

如果可用,从缓存中检索响应(与 UpdateCacheMiddleware 配对)。

需要缓存后端。 UpdateCacheMiddleware

在视图后缓存响应。

放置在 MIDDLEWARE 的末尾以完全覆盖。 ConditionalGetMiddleware

支持 ETag/Last-Modified 检查的 HTTP 304 (Not Modified)。

增强性能。 GZipMiddleware

为支持 gzip 的客户端压缩响应。

放置在 CommonMiddleware 之后。 LocaleMiddleware

通过设置 request.LANGUAGE_CODE 启用 i18n

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。如需转载,请注明文章出处豆丁博客和来源网址。https://shluqu.cn/49421.html
点赞
0.00 平均评分 (0% 分数) - 0