官方文档有点乱:'before' & 'after' 用于在元组中对 MiddleWare 进行排序,但在某些地方 'before'&'after' 指的是请求-响应阶段。此外,“应该是第一个/最后一个”是混合的,不清楚哪个用作“第一个”。
我确实理解其中的区别。但是对于 Django 的新手来说,这似乎很复杂。
您能否为内置的 MiddleWare 类推荐一些正确的顺序(假设我们启用了所有这些类)并且——最重要的是——解释为什么一个在其他类之前/之后?
这是列表,其中包含我设法找到的文档中的信息:
UpdateCacheMiddleware
- 在那些修改 'Vary:'
SessionMiddleware
,GZipMiddleware
,LocaleMiddleware
- 在那些修改 'Vary:'
GZipMiddleware
- 在任何可能更改或使用响应体的 MW 之前
- 之后
UpdateCacheMiddleware
:修改“变化:”
ConditionalGetMiddleware
- 之前
CommonMiddleware
:使用它的“Etag:”标头时USE_ETAGS=True
- 之前
SessionMiddleware
- 之后
UpdateCacheMiddleware
:修改“变化:” - 之前
TransactionMiddleware
:我们这里不需要交易
- 之后
LocaleMiddleware
, 最顶层之一,仅次于SessionMiddleware、CacheMiddleware- 之后
UpdateCacheMiddleware
:修改“变化:” - 之后
SessionMiddleware
:使用会话数据
- 之后
CommonMiddleware
- 在任何可能改变响应的 MW 之前(它计算 ETags)
- 之后
GZipMiddleware
它不会计算压缩内容的电子标签 - 靠近顶部:它在
APPEND_SLASH
或时重定向PREPEND_WWW
CsrfViewMiddleware
- 在任何假定 CSRF 攻击已被处理的视图中间件之前
AuthenticationMiddleware
- 之后
SessionMiddleware
:使用会话存储
- 之后
MessageMiddleware
- After
SessionMiddleware
:可以使用基于Session的存储
- After
XViewMiddleware
TransactionMiddleware
- 在使用 DB 的 MW 之后:(
SessionMiddleware
可配置为使用 DB) - 全部
*CacheMiddleWare
不受影响(作为一个例外:使用自己的 DB 游标)
- 在使用 DB 的 MW 之后:(
FetchFromCacheMiddleware
- 在那些修改'Vary:'的那些之后,如果使用它们为缓存哈希键选择一个值
- 之后
AuthenticationMiddleware
可以使用CACHE_MIDDLEWARE_ANONYMOUS_ONLY
FlatpageFallbackMiddleware
- 下:最后的手段
- 但是,使用 DB 不是问题
TransactionMiddleware
(是吗?)
RedirectFallbackMiddleware
- 下:最后的手段
- 但是,使用 DB 不是问题
TransactionMiddleware
(是吗?)
(我会将建议添加到此列表中,以便将所有建议收集在一个地方)