Django:将模型中的异常传播到视图

时间:2014-04-28 07:37:37

标签: python django

我有一个拥有多种方法的模型,这些方法使用第三方调用(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,我认为这不是放置这些块的好地方,因为错误的起源在模型中#39;方法,不在视野中。

那么如何处理模型中的错误并仍能在视图中重定向该错误?

2 个答案:

答案 0 :(得分:0)

为了更好的一致性,我会在模型中捕获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 :(得分:0)

解决此问题的简单方法是简单地捕获异常,然后再次重新提升它。这无法解决与应用程序组合方式有关的更大问题。

您应避免将支付逻辑与您的模型紧密耦合;明天,如果你必须添加另一个支付提供商,你将有一个美好的时间从你的模型中提取逻辑。

您应该将您的付款逻辑保留在您的观点之外。您的付款方式视图应处理金额和付款方式;其他任何事情都应该单独处理,这是我的建议(高度简化):

  1. 为您的应用程序创建Stripe API的包装器。这样可以更轻松地更换Stripe或稍后添加其他提供程序。

  2. 这个包装器应该接受三件事:

    1. 支付金额
    2. 交易的日期和时间
    3. 付款方式(可能默认为Stripe)
    4. 然后,您的包装器将使用提供者的API启动付款并返回成功或失败条件,以及来自提供者的任何有效负载(如交易参考等)

    5. 您的视图将拦截交易结果,如果成功 - 更新您的模型;如果失败,请再次更新模型并相应地重定向用户。

    6. 这样你就有了:

      1. 为您的付款逻辑制作了可插拔的架构。
      2. 删除了模型之外的非模型相关逻辑。
      3. 让您的观点成为付款流程的“控制者”。