【发布时间】:2011-06-05 15:54:15
【问题描述】:
官方文档有点乱:'before' & 'after' 用于在元组中排序 MiddleWare,但在某些地方 'before'&'after' 指的是请求-响应阶段。此外,“应该是第一个/最后一个”是混合的,不清楚哪个用作“第一个”。
我确实理解其中的区别。但是对于 Django 的新手来说,这似乎很复杂。
您能否为内置的 MiddleWare 类推荐一些正确的顺序(假设我们启用了所有这些类)并且——最重要的是——解释为什么一个在其他类之前/之后?
这是列表,其中包含我设法找到的文档中的信息:
-
UpdateCacheMiddleware- 在那些修改'Vary:'之前
SessionMiddleware、GZipMiddleware、LocaleMiddleware
- 在那些修改'Vary:'之前
-
GZipMiddleware- 在任何可能更改或使用响应正文的 MW 之前
-
UpdateCacheMiddleware之后:修改“Vary:”
-
ConditionalGetMiddleware- 在
CommonMiddleware之前:在USE_ETAGS=True时使用其'Etag:' 标头
- 在
-
SessionMiddleware-
UpdateCacheMiddleware之后:修改“Vary:” -
TransactionMiddleware之前:我们这里不需要交易
-
-
LocaleMiddleware,最顶层之一,在 SessionMiddleware、CacheMiddleware 之后-
UpdateCacheMiddleware之后:修改“Vary:” -
SessionMiddleware之后:使用会话数据
-
-
CommonMiddleware- 在任何可能改变响应的 MW 之前(它计算 ETag)
- 在
GZipMiddleware之后,它不会计算压缩内容的电子标签 - 接近顶部:当
APPEND_SLASH或PREPEND_WWW时重定向
-
CsrfViewMiddleware- 在任何假定 CSRF 攻击已被处理的视图中间件之前
-
AuthenticationMiddleware-
SessionMiddleware之后:使用会话存储
-
-
MessageMiddleware-
SessionMiddleware之后:可以使用基于Session的存储
-
XViewMiddleware-
TransactionMiddleware- 在使用 DB 的 MW 之后:
SessionMiddleware(可配置为使用 DB) - 所有
*CacheMiddleWare不受影响(例外:使用自己的数据库游标)
- 在使用 DB 的 MW 之后:
-
FetchFromCacheMiddleware- 在那些修改 'Vary:' 之后,如果使用它们来选择缓存哈希键的值
- 在
AuthenticationMiddleware之后,所以可以使用CACHE_MIDDLEWARE_ANONYMOUS_ONLY
-
FlatpageFallbackMiddleware- 底部:最后的手段
- 不过,使用 DB 对
TransactionMiddleware来说不是问题(是吗?)
-
RedirectFallbackMiddleware- 底部:最后的手段
- 不过,使用 DB 对
TransactionMiddleware来说不是问题(是吗?)
(我会将建议添加到此列表中,以便将所有建议收集到一个地方)
【问题讨论】:
-
MessageMiddleware 需要在 SessionMiddleWare 之后,因为消息框架可以使用基于会话的后端来存储消息。
-
这应该是一个社区问题,因为不可能有一个人有一个正确的答案:) 但是,我没有看到任何复选框
-
我同意该术语令人困惑。也许“内部”和“外部”会更合适。那些靠近 settings.MIDDLEWARE_CLASSES 开头的列表是“外部;”列在最后的那些是“内部”。这与 django 文档中的图形描述相匹配,并且还表示中间件在执行时可以设置一个环境后续中间件将在其中运行。
-
为什么这个问题没有数百个星星和点赞,我永远不会知道!谢谢!
-
Django 在两年内发生了很大的变化,有没有指向相同但更最近资源的指针?谢谢,+1ed。