使用中间件

时间:2016-06-09 21:55:17

标签: django transactions

我们将我们的主要django网站从1.4升级到1.9。我想pull a github并使用laboratory针对现有生产网站测试升级后的网站。但是,出于显而易见的原因,我无法将新网站写入(postgres)生产数据库。

现在,我可能只是为了确保这个readonly实例只读db权限,但我不能在每次写入时都出错。似乎我应该能够设置有问题的数据库连接以使用ATOMIC_REQUESTS = True,然后编写中间件以在每个请求结束时回滚事务,但是在Django的事务中已经发生了很大变化从1.4开始处理,我不太确定实现中间件的最佳方法。

无论如何,我如何编写中间件来可靠地回滚每个事务?

1 个答案:

答案 0 :(得分:1)

正确的做法是设置AUTOCOMMIT=False而不是设置ATOMIC_REQUESTS = True

  

您可以完全禁用给定的Django事务管理   数据库通过在其配置中将AUTOCOMMIT设置为False。如果你   这样做,Django将不会启用自动提交,并且不会执行任何操作   提交。您将获得底层数据库的常规行为   图书馆。        这要求您明确提交每个事务,甚至是由Django或第三方库启动的事务。因此,这是   最适合您想要自己运行的情况   事务控制中间件或做一些非常奇怪的事情。

因此,除非您提交所有内容,否则实际上没有任何内容进入数据库。如果您使用数据库支持的会话,则需要在那里进行手动提交,但保留其他所有内容。这样可以避免修改实时服务器中的任何数据。

AUTOCOMMIT = False进入settings.py,如下所示:

DATABASE = {
   'default': { /* other stuff */,
         AUTOCOMMIT: False,
    }
}

此方法不涉及创建任何自定义中间件。它可以很容易地打开和关闭。