Как повторить код 5 раз с интервалом 5 секунд между каждой попыткой - PullRequest
0 голосов
/ 22 марта 2019

У меня есть некоторый код, который проверяет данные, поступающие из Webhook Stripe. Теперь я получил код, который запрашивает мою базу данных, чтобы проверить, был ли подтвержден платеж. Я пытаюсь написать функцию, которая проверяет мою базу данных, чтобы увидеть, был ли подтвержден платеж, если платеж еще не подтвержден, программа должна подождать 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',)

Ответы [ 2 ]

1 голос
/ 22 марта 2019

Вы можете сделать это, поместив логику запроса / проверки в цикл for.Поскольку вы хотите выполнить эти действия не более 5 раз, вы можете выполнить цикл for над range(5), и, если вы используете 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
0 голосов
/ 22 марта 2019

Вы можете определить переменную для количества попыток и времени ожидания на одну попытку.(В настоящее время у вас есть 5 и 5, но они могут измениться, и вы не хотите вручную редактировать каждое вхождение позже.)

Там после использования цикла for количество попыток и time.sleep(time_per_try).Примечание. Для этого вам потребуется import time.

...