官方文档有点混乱:“在”之前“和”之后“用于在元组中订购MiddleWare,但在某些地方,”前“和”后“指的是请求响应阶段。此外,“应该是第一/最后”是混合的,并且不清楚哪一个应该用作“第一”。
我明白这区别..。然而,对于Django的新手来说,这似乎很复杂。
您能为内置的MiddleWare类提出一些正确的排序(假设我们启用了所有这些类),并且--最重要的是--解释为什么在其他类之前/之后?
下面列出了我设法找到的文档的信息:
在修改“Vary:”、“
UpdateCacheMiddleware”、“LocaleMiddleware”之前的
在任何MW之前在
GZipMiddleware UpdateCacheMiddleware:修改UpdateCacheMiddleware
ConditionalGetMiddleware CommonMiddleware:在USE_ETAGS=True时使用它的'Etag:‘头
修改
SessionMiddleware 'Vary:'TransactionMiddleware:我们不需要事务here
LocaleMiddleware,是最顶端之一,在SessionMiddleware之后,CacheMiddleware UpdateCacheMiddleware之后:修改'Vary:'SessionMiddleware:uses data
CommonMiddleware GZipMiddleware之后计算APPEND_SLASH或PREPEND_WWW时重定向。
在任何假定CSRF攻击已被with处理的视图中间件之前,with
AuthenticationMiddleware SessionMiddleware之后:使用session storage
MessageMiddleware SessionMiddleware之后:可以使用基于会话的storage
XViewMiddlewareTransactionMiddleware SessionMiddleware (可配置为使用DB )*CacheMiddleWare不受影响(作为一个例外:使用自己的DB
FetchFromCacheMiddleware AuthenticationMiddleware的值,那么就可以使用CACHE_MIDDLEWARE_ANONYMOUS_ONLY
FlatpageFallbackMiddleware TransactionMiddleware (yes?)来说,最后一个 DB并不是一个问题。
RedirectFallbackMiddleware TransactionMiddleware (yes?)来说,最后一个 DB并不是一个问题。
(我将在这份清单中添加建议,将所有建议集中在一个地方)
发布于 2011-01-08 04:42:41
最困难的部分是,你必须同时考虑两个方向时,制定订单。我会说这是设计中的一个缺陷,我个人会选择一个单独的request和response中间件订单(这样您就不需要像FetchFromCacheMiddleware和UpdateCacheMiddleware这样的黑客了)。
但是..。唉,现在是这边。
无论哪种方式,其思想都是您的请求以自顶向下的顺序传递给process_request和process_view的中间件列表。它以相反的顺序通过process_response和process_exception传递您的响应。
使用UpdateCacheMiddleware,这意味着任何更改HTTP请求中的Vary头的中间件都应该出现在它之前。如果您在这里更改订单,那么某些用户将有可能为其他用户获取缓存的页面。
如何找出中间件是否更改了Vary报头?您可以希望有可用的文档,也可以简单地查看源代码。这通常很明显:)
发布于 2011-03-10 20:21:27
一个可以节省您的头发的小窍门是将TransactionMiddleware放在列表中的这样一个位置,在这个列表中,它无法回滚由其他中间件提交给数据库的更改,不管视图是否引发异常,这些更改都应该被提交给数据库。
https://stackoverflow.com/questions/4632323
复制相似问题