如何在每次尝试之间用 5 秒 space 重试代码 5 次
How to retry code 5 times with 5 seconds space between each attempt
我有一些代码可以检查来自 Stripe 的 Webhook 的数据。现在我得到了一些代码来查询我的数据库以检查付款是否已确认。我正在尝试编写一个函数来检查我的数据库以查看付款是否已确认,如果尚未确认付款,程序应等待 5 秒然后再次检查,最多检查 5 次。如果第五次尝试后付款仍未显示为已确认,那么我需要重定向用户。
这是因为我的代码执行速度可能比 Stripe returns 他们对我的服务器的 webhook 响应更快。
当前代码如下。如何在 if 语句中创建 'loop'?
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',)
您可以为重试次数和每次尝试的休眠时间定义一个变量。 (目前你有 5 和 5,但它可能会改变,你不想以后手动编辑每个出现。)
然后在重试次数和 time.sleep(time_per_try)
上使用 for 循环。
注意:您必须 import time
为此。
您可以通过将 query/check 逻辑包装在 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
我有一些代码可以检查来自 Stripe 的 Webhook 的数据。现在我得到了一些代码来查询我的数据库以检查付款是否已确认。我正在尝试编写一个函数来检查我的数据库以查看付款是否已确认,如果尚未确认付款,程序应等待 5 秒然后再次检查,最多检查 5 次。如果第五次尝试后付款仍未显示为已确认,那么我需要重定向用户。
这是因为我的代码执行速度可能比 Stripe returns 他们对我的服务器的 webhook 响应更快。
当前代码如下。如何在 if 语句中创建 'loop'?
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',)
您可以为重试次数和每次尝试的休眠时间定义一个变量。 (目前你有 5 和 5,但它可能会改变,你不想以后手动编辑每个出现。)
然后在重试次数和 time.sleep(time_per_try)
上使用 for 循环。
注意:您必须 import time
为此。
您可以通过将 query/check 逻辑包装在 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