官方文档有点乱:'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
XViewMiddlewareTransactionMiddleware- 在使用 DB 的 MW 之后:(
SessionMiddleware可配置为使用 DB) - 全部
*CacheMiddleWare不受影响(作为一个例外:使用自己的 DB 游标)
- 在使用 DB 的 MW 之后:(
FetchFromCacheMiddleware- 在那些修改'Vary:'的那些之后,如果使用它们为缓存哈希键选择一个值
- 之后
AuthenticationMiddleware可以使用CACHE_MIDDLEWARE_ANONYMOUS_ONLY
FlatpageFallbackMiddleware- 下:最后的手段
- 但是,使用 DB 不是问题
TransactionMiddleware(是吗?)
RedirectFallbackMiddleware- 下:最后的手段
- 但是,使用 DB 不是问题
TransactionMiddleware(是吗?)
(我会将建议添加到此列表中,以便将所有建议收集在一个地方)