Как периодически повторять функцию до успеха в фоновом режиме в Django? - PullRequest
1 голос
/ 02 декабря 2019

Я работаю над проектом Django. Я хочу сделать http запрос на внешний сервер. Но иногда внешний сервер возвращает 5xx. Я хочу повторить запрос на фоне, пока он не вернет 200. Как я могу это сделать? Это псевдокод того, что я хочу сделать:

response = requests.post(url, json=param)

if response.status_code == 200:
    # do something
elif response.status_code >= 500:
    # schedule task to retry every 30 seconds until success

Ответы [ 2 ]

2 голосов
/ 02 декабря 2019

Поскольку задача загрузки не является задачей синхронизации, вам нужна очередь задач для архивирования вашей цели.

Celery - это распределенная очередь задач, которая может быть легко интегрирована с Django.

Вы можете создать задачу загрузки следующим образом:

from proj.celery import app

@app.task(bind=True)
def download(self, url, param):
    response = requests.post(url, json=param)
    if response.status_code == 200:
        # do something
        ...
    elif response.status_code >= 500:
        # schedule task to retry every 30 seconds until success
        raise self.retry(countdown=30)

Для вызова вашей задачи:

download.apply_async(('YOUR DOWNLOAD URL', None))

Ссылки о сельдерее:

  1. Использование задачи сельдерея .
  2. Как интегрировать сельдерей с Django
0 голосов
/ 02 декабря 2019

Примерно так бы и получилось:

import time

RETRY_TIME = 30

referenceTime = time.time()

while(1):
    currentTime = time.time()
    dt = currentTime - referenceTime

    if(dt > RETRY_TIME):
        referenceTime += RETRY_TIME
        print("hello")

        #   do your request here

        if(response.status_code == 200):
            break
...