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