会话中间件:事务中间件之前还是之后?

时间:2012-03-12 09:06:08

标签: django transactions django-middleware

关于中间件的顺序,this question表示:

  

SessionMiddleware

     
      
  • TransactionMiddleware之前:我们不需要此处的交易
  •   

为什么我不想在我的交易中更新会话?如果会话更新为视图中出现的某些副作用并且视图失败,我无法想象我希望会话仍然更新,就好像它没有失败一样。 (显然,如果会话引擎不是基于数据库的,则必须以其他方式解决此问题。)

请提供一个明确的用例,说明为什么我可能希望SessionMiddlewareTransactionMiddleware之外运行。

1 个答案:

答案 0 :(得分:3)

会话中间件由Message Middleware使用。我们通常希望从交易中排除消息中间件。

来自Messages Middleware page

  

如果您使用的是依赖会话的存储后端(默认),则必须启用“django.contrib.sessions.middleware.SessionMiddleware”并在MIDDLEWARE_CLASSES中的MessageMiddleware之前显示。

由于我们可能希望将事务失败显示为用户消息,因此我们会从事务中排除消息中间件。

同样在长时间运行的进程中,我通常使用Messages / Session来不断更新进程状态。通过Ajax调用检索相同的内容。如果在事务之后放置消息或会话MW,则状态更新将不响应。