【问题标题】:How to retry code 5 times with 5 seconds space between each attempt如何重试代码 5 次,每次尝试之间有 5 秒的间隔
【发布时间】:2019-03-21 21:32:04
【问题描述】:

我有一些代码可以检查来自 Stripe 的 Webhook 的数据。现在我得到了一些代码来查询我的数据库以检查付款是否已确认。我正在尝试编写一个检查我的数据库以查看是否已确认付款的函数,如果尚未确认付款,则程序应等待 5 秒然后再次检查,最多检查 5 次。如果在第五次尝试后付款仍然没有显示为已确认,那么我需要重定向用户。

这是因为我的代码执行速度可能比 Stripe 将其 webhook 响应返回到我的服务器更快。

当前代码如下。如何在 if 语句上创建“循环”?

def accepted(request, payment_id):

    r = Usertasks.objects.all().filter(user=request.user).filter(randomURL=payment_id).values("TaskPostedToNetwork")
    e = Usertasks.objects.all().filter(user=request.user).filter(randomURL=payment_id).values("PaymentConfirmed")
    if r == "False" and e == "yes":
        print("true")
    else:
        return redirect('dashboard:index')
    return render(request, 'request.html',)

【问题讨论】:

  • 您希望在每次尝试时重试这段代码的哪一部分?获取re
  • @HenryWoody if/else 部分
  • 所以想再检查一下r == "False" and e == "yes"?
  • @HenryWoody 正确。

标签: python redirect webhooks retrywhen


【解决方案1】:

您可以通过将查询/检查逻辑包装在 for 循环中来做到这一点。由于您最多希望执行这些操作 5 次,因此您可以在 range(5) 上执行 for 循环,并且由于成功时使用 return,因此循环将在成功时停止。因此最多5次。

在另一种情况下,当您再次检查而不是退出函数时,您可以调用 time.sleep(5) 停止执行并等待 5 秒。

如果循环完成(执行块 5 次但未成功并退出),那么您将到达 return redirect... 行。

像这样:

import time

def accepted(request, payment_id):
    seconds_between_calls = 5
    max_calls = 5
    for _ in range(max_calls):
        r = Usertasks.objects.all().filter(user=request.user).filter(randomURL=payment_id).values("TaskPostedToNetwork")
        e = Usertasks.objects.all().filter(user=request.user).filter(randomURL=payment_id).values("PaymentConfirmed")
        if r == "False" and e == "yes":
            print("true")
            return render(request, 'request.html',)
        else:
            # try again
            time.sleep(seconds_between_calls)    
    return redirect('dashboard:index') # if max_calls hit

【讨论】:

  • 假设我将print("true") 部分更改为return。这也会停止 for 循环吗?
  • 是的,如果你在那个地方放一个return,你也会退出这个函数。但是你不会得到“重试”类型的逻辑
  • 嗯,意思是一旦 IF 语句为 True,它应该将用户返回到另一个页面并退出重试循环。我认为这仍然有效,对吧?
  • 哦,如果 if 为 False,您是否要再试一次(并且您会到达 else 语句),如果您得到的 False 超过 5,您是否想再试一次并重定向到 'dashboard:index'次?
  • @Phillip 它应该只被击中一次,如果有的话,return 的作用类似于break,但更强大
【解决方案2】:

您可以为重试次数和每次尝试的睡眠时间定义一个变量。 (目前你有 5 和 5,但它可能会改变,你不想以后手动编辑每个出现。)

在重试次数和time.sleep(time_per_try) 上使用for 循环之后。 注意:您必须为此import time

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-31
    • 1970-01-01
    • 2023-03-29
    • 2020-07-06
    • 2016-03-13
    • 1970-01-01
    相关资源
    最近更新 更多