如何重试代码 5 次,每次尝试之间间隔 5 秒



我有一些代码可以检查来自 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',)
您可以通过将

查询/检查逻辑包装在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

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

在重试次数

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

最新更新