如何在Python中等待POST请求(requests.post)完成?

时间:2016-06-17 19:37:39

标签: python python-requests

我正在使用Python中的请求库来进行POST调用。 我的POST呼叫大约需要5分钟才能完成。它将在S3存储桶中创建一个文件。 之后,我想下载这个文件。但是,我需要创建一个额外的逻辑来等待我的POST完成,然后在我的代码上执行下一行来下载文件。

有什么建议吗?

是否可以使用子进程库?如果是这样,语法怎么样?

代码:

import requets
r = requests.post(url)
# wait for the post call to finish
download_file(file_name)

3 个答案:

答案 0 :(得分:1)

它应该等到它完成。

与Node.js不同,Python默认会阻止请求。如果要运行异步,则必须在另一个线程中显式运行它。如果你的POST请求需要5分钟才能获取,那么下载行将不会运行,直到5分钟结束并且POST请求完成。

答案 1 :(得分:1)

问题是POST请求需要5分钟才能返回,但也许这不是很正确?也许POST请求会立即返回,但是服务器继续研磨5分钟为S3存储桶创建文件?在这种情况下,延迟的需要是有道理的。根本需要单独下载的事实往往支持这种解释(请求的信息不会从请求本身返回)。

如果下载失败会引发异常,请尝试以下操作:

import time
r = requests.post(url)
while True:
    time.sleep(60) # sixty second delay
    try:
        download_file(file_name)
        break
    except Error:
        print ("File not ready, trying again in one minute")

或者,如果download_file在失败时返回False:

import time
r = requests.post(url)
while True:
    time.sleep(60) # sixty second delay
    if download_file(file_name):
        break
    print ("File not ready, trying again in one minute")

由于我对这个问题的解释是推测性的,如果不是这一点,我会删除这个答案。

答案 2 :(得分:0)

迈克尔的答案是正确的。但是,如果您正在运行Selenium来爬网网页,则前端JS需要一些时间来适当地呈现和显示请求结果。在这种情况下,我倾向于使用:

import time
time.sleep(5)

也就是说,在这种情况下,您还有显式隐式等其他选项。看一下:Slenium Waits documentation

如果您直接将请求发送到API,Python将等待响应,直到响应完成。