【问题标题】:Session middleware: before or after transaction middleware?会话中间件:在事务中间件之前还是之后?
【发布时间】:2012-03-12 09:06:07
【问题描述】:

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

SessionMiddleware

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

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

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

【问题讨论】:

    标签: django transactions django-middleware


    【解决方案1】:

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

    来自Messages Middleware page

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

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

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

    【讨论】:

    • 使用会话来传达有关事务失败的消息是一个很好的用例。谢谢你。你能解释一下长时间运行的进程是什么意思吗?你的意思是日志运行请求,比如大文件上传?
    • 是的,长时间运行的请求/进程就像大文件上传,甚至是服务器端进程需要时间的情况。假设您正在使用 API 将用户的所有推文保存在数据库中。您可能希望通过在会话中保存状态并使用 AJAX 检索它来不断更新作业的状态。
    猜你喜欢
    • 1970-01-01
    • 2017-05-23
    • 1970-01-01
    • 2020-05-22
    • 2016-05-10
    • 1970-01-01
    • 2014-03-03
    • 2015-09-28
    • 1970-01-01
    相关资源
    最近更新 更多