2016-04-21 41 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 ... 
相關問題