我正在使用Python中的请求库来进行POST调用。 我的POST呼叫大约需要5分钟才能完成。它将在S3存储桶中创建一个文件。 之后,我想下载这个文件。但是,我需要创建一个额外的逻辑来等待我的POST完成,然后在我的代码上执行下一行来下载文件。
有什么建议吗?
是否可以使用子进程库?如果是这样,语法怎么样?
代码:
import requets
r = requests.post(url)
# wait for the post call to finish
download_file(file_name)
答案 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将等待响应,直到响应完成。