2016-06-17 96 views
0

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

有什么建议吗?

是否有可能为此使用子流程库?如果是这样,语法将如何?

代码:

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

你真的尝试过吗?它应该像你期望的那样工作。 – hichris123

回答

0

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

如果下载失败抛出一个异常,试试这个:

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只是失败则返回错误:

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") 

由于我这个问题的解释是投机性的,我会删除这个答案,如果它不是重点。

+0

这是正确的。 POST请求立即返回,但服务器有一些处理要做。我会尝试你的解决方案。谢谢! – GreenTeaTech

0

应该已经等待,直到它完成。

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

+1

这应该是一个评论。或者你可以更好地解释为什么它会等待请求完成。 –

+2

由于默认情况下python代码不是异步的? – Anonymous