django transaction atomc decorator,class view

时间:2016-04-21 07:25:59

标签: django

我有几个基于类的视图。

在其中一个中,让我们说View1可以调用其他视图来返回响应。

所以我有这样的事情:

class View1(View):
  def post(self, request, *args, **kwargs):
     # Some logic ...
     return View2.as_view()(request) # There are more lines like this calling to other views.

所以View1有点像路线视图。根据某些条件,它将请求传递给其他视图以返回响应。

我想在transaction.atomic上使用View1装饰器,原子事务是否适用于我调用的所有视图?即对其他观点的调用不会取消原子请求吗?

到目前为止,我使用以下方法来装饰View1:

  • transaction.atomic中的视图包装在网址中。
  • @method_decorator(transaction.atomic)的{​​{1}}方法上使用了post()

问题是,使用两种方法中的任何一种将视图设置为原子,即使View1返回错误(异常)" View1也没有返回HttpResponse ..",对象是仍然被创造。

为什么?

1 个答案:

答案 0 :(得分:0)

您还可以定义一个可以使用的基于类的mixin:

class AtomicMixin(object):
    def dispatch(self, request, *args, **kwargs):
        with transaction.atomic():
            return super(AtomicMixin, self).dispatch(request, *args, **kwargs)

class View1(AtomicMixin, View):
    def post(self, request, *args, **kwargs):
        # Some logic ...