源内容(英文)
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 包含一组强大的内置中间件类,在新项目中默认启用。以下是包括其用途和关键设置在内的全面概述:
用途
—
添加安全标头(例如 HSTS、X-Content-Type-Options);将 HTTP 重定向到 HTTPS。
启用会话处理;将会话数据附加到请求。
通过验证 POST/PUT/DELETE 请求中的令牌来防止 CSRF 攻击。
通过设置 X-Frame-Options 标头来防止点击劫持。
处理条件 GET 的 ETags、尾部斜杠/www 的重定向以及 gzip 压缩提示。
填充 request.user; 需要会话。
将消息(例如来自 messages.success())附加到请求以供显示。
如果可用,从缓存中检索响应(与 UpdateCacheMiddleware 配对)。
在视图后缓存响应。
支持 ETag/Last-Modified 检查的 HTTP 304 (Not Modified)。
为支持 gzip 的客户端压缩响应。
通过设置 request.LANGUAGE_CODE 启用 i18n