2012-03-12 58 views
1

关于中间件的顺序,this question规定:会话中间件:事务中间件之前还是之后?

SessionMiddleware

  • 之前TransactionMiddleware:我们不需要在这里

交易为什么我不希望我的会话更新在我的交易?如果会话更新为视图中发生的某些事件的副作用,并且视图失败,我无法想象会出现这样的情况,即我希望会话仍然更新,就好像它没有失败一样。 (显然,如果会话引擎不是DB-基础,这个问题就必须走近一些其他的方式。)

请为什么我可能希望SessionMiddlewareTransactionMiddleware之外运行一个明确的使用情况。

回答

3

会话中间件由消息中间件使用。我们通常喜欢从事务中排除消息中间件。

Messages Middleware page

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

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

同样在长时间运行的进程中,我通常使用消息/会话来持续更新进程状态。 Ajax调用可以检索到相同的结果。如果消息或会话MW位于事务之后,则状态更新不会响应。

+0

使用会话传达有关事务失败的消息是一个很好的用例。谢谢。你能解释一下长期运行的流程是什么意思吗?你的意思是日志运行请求,如大文件上传? – 2012-03-13 19:45:06

+0

是的,长时间运行的请求/进程就像大文件上传,甚至在服务器端需要花费时间。假设您正在使用API​​将用户的所有推文保存在数据库中。您可能希望通过在会话中保存状态并使用AJAX检索它来继续更新作业的状态。 – Pratyush 2012-03-13 19:52:05