最近在用python做文件上传,因为设置了超时时间,因此总会有超时报错的时候。
在一开始,我使用的方案是:
import requests
from retrying import retry
@retry
def post_file(self, url, files):
r = self.session.post(url, timeout=120, verify=False, files=files)
r.encoding = r.apparent_encoding
return r.text
然而用Fiddler抓包后,发现有Bug:使用@retry重试时的请求体很小,因为并不附带有文件内容,最终会导致上传失败。
于是便去查找requests库自身的文件重传方法,找到了这篇《Python Requests.post()请求失败时的retry设置》,并加以优化:
self.session = requests.Session()
# whitelist=False: 使得所有类型请求(如GET、POST等)都被重试
self.session.mount('http://', HTTPAdapter(max_retries=Retry(total=5, method_whitelist=False)))
self.session.mount('https://', HTTPAdapter(max_retries=Retry(total=5, method_whitelist=False)))
网友评论