Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在Django中定期重复一个函数,直到在后台成功?_Python_Django_Scheduling_Periodic Task - Fatal编程技术网

Python 如何在Django中定期重复一个函数,直到在后台成功?

Python 如何在Django中定期重复一个函数,直到在后台成功?,python,django,scheduling,periodic-task,Python,Django,Scheduling,Periodic Task,我在做一个Django项目。我想向外部服务器发出http请求。但有时外部服务器返回5xx。我想在后台重试请求,直到它返回200。我该怎么做? 这是我想做的一个伪代码: response=requests.post(url,json=param) 如果response.status_code==200: #做点什么 elif response.status_code>=500: #计划每30秒重试一次任务,直到成功 像这样的东西可以达到以下目的: import time RETRY_TIME =

我在做一个Django项目。我想向外部服务器发出http请求。但有时外部服务器返回5xx。我想在后台重试请求,直到它返回200。我该怎么做? 这是我想做的一个伪代码:

response=requests.post(url,json=param)
如果response.status_code==200:
#做点什么
elif response.status_code>=500:
#计划每30秒重试一次任务,直到成功

像这样的东西可以达到以下目的:

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

由于下载任务不是同步任务,您需要一个任务队列来归档您的目标

是一种分布式任务队列,可以轻松地与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))
有关芹菜的参考资料:

  • 在你的理解中,“在Django的背景中”意味着什么