2016-04-21 91 views
0

我有几个基于类的视图。django事务atomc装饰器,类视图

其中之一,让我们说,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有些路线图。基于某些条件,它将请求传递给其他视图以返回响应。

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

到目前为止,我用下面的方法来装饰视图1:

  • 包裹鉴于transaction.atomic中的URL。
  • 使用@method_decorator(transaction.atomic)post()方法View1

的问题是,使用任何两种方法来设置视图为原子,即使视图1,错误(例外)返回“视图1没有返回HttpResponse对象。”,仍然得到创建的对象。

为什么?

+0

原子数据库事务,以确保数据将被保留,而不是返回一个HTTP响应也不会影响 – Sayse

+0

所以问题是什么时候执行回滚?根据django文档,任何以未捕获异常退出的原子视图都不会创建对象。而不是返回HttpResponse是在Django的例外.. https://docs.djangoproject.com/en/1.9/topics/db/transactions/#django.db.transaction.atomic – user3599803

+0

嗯,你是对的,我一直假设它涉及到数据库错误(道歉),我认为问题是没有返回http响应的错误不在原子块的范围内,因为它调用视图责任的方法来确保它返回一个响应 – Sayse

回答

0

您还可以定义基于类的混入,您可以使用:

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 ...