簡體   English   中英

Django:將異常從模型傳播到視圖

[英]Django : Propagate exception from models to a view

我有一個模型,其中包含許多方法,這些方法使用第三方調用(Stripe),這可能會引發一些錯誤。

在模型中,我正在處理該錯誤:

class Plan(models.Model):
    def update():
       try:
           // get the customer data related to id "xyz"
       except StipeError as error_obj:
           return error_message

鑒於我正在Plan實例上調用上述方法

我更喜歡將try-catch放在視圖中,但不要在那里捕獲StriprError ,它將被模型捕獲。 因此,有了在模型和以下視圖中處理錯誤的想法:

def plan_view(request):
   .....
   try: 
      plan.update()
   except:
     //redirect with exception message

一種方法是將try-catch塊放在視圖中並在那里處理StripeError ,我認為這不是放置這些塊的好地方,因為錯誤的起源在模型的方法中,而不是在視圖中。

那么ia如何處理模型中的錯誤並仍然能夠在視圖中重定向該錯誤?

為了獲得更好的一致性,我會在模型中捕獲StipeError,並在模型中引發另一個適當的異常,plan_view(..)可能會捕獲該異常。 這樣一來,視圖就可以始終不了解模型內進行的任何高級業務。

class Plan(models.Model):
    def update():
       try:
           // get the customer data related to id "xyz"
       except StipeError as error_obj:
           raise UpdateException() # define the exception outside of the model

....

def plan_view(request):
   .....
   try: 
      plan.update()
   except UpdateException:
     //redirect with exception message

解決此問題的簡單方法是簡單地捕獲異常,然后重新引發它。 這不會解決更大的問題,該問題與應用程序的組合方式有關。

您應該避免將付款邏輯與模型緊密結合; 明天,如果您必須添加其他付款提供商,您將度過一個美好的時光,將邏輯從模型中提取出來。

您應該將付款邏輯保持在您的視野之外。 您的付款視圖應處理金額和付款方式; 其他任何事情都應單獨處理,這是我的建議(高度簡化):

  1. 為您的應用程序圍繞Stripe API創建包裝器。 這將使換出Stripe或以后添加其他提供程序變得更加容易。

  2. 這個包裝器應該接受三件事:

    1. 應付金額
    2. 交易日期和時間
    3. 付款方式(可以默認為Stripe)

    然后,您的包裝器將使用提供者的API進行付款,並返回成功或失敗條件,以及來自提供者的任何有效負載(例如交易參考等)

  3. 您的視圖將攔截交易的結果,如果交易成功,則更新模型; 如果失敗,請再次更新模型並相應地重定向用戶。

這樣,您可以:

  1. 為您的付款邏輯設計了可插拔的體系結構。
  2. 在模型之外刪除了與模型無關的邏輯。
  3. 讓您的觀點成為付款流程的“控制者”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM