我们可以使用Python的request.post上载带有进度条回调的文件吗?

问题描述

我的直觉不是。该request.post本质上受阻。但是我可能是错的,即使我是对的,我也很想弄清楚有什么替代方案。基本上,我有一个文件上传请求,可以在Firefox网络控制台中看到该文件,并以提取形式复制,然后使用request.post在python中进行复制。

工作正常。有条理地上传文件。

但是我想要一个进度条。

我正在使用python3-wget软件包下载它,它具有进度条。整齐。快速浏览内部,似乎有点麻烦,使用urllib而不是request包。这是我正在使用的代码:

BaseURL =        result["BaseURL"]
Signature =      result["Signature"]
GoogleAccessId = result["AccessKey"]["Value"]
CacheControl =   result["AdditionalBody"][0]["Value"]
Policy =         result["PolicyBase64"]
ACL =            result["ACL"]
KeyPrefix =      result["KeyPrefix"]

Type = os.path.splitext(local_file)[1][1:]
Checksum = api.check_sum(local_file)

if Type:     
    Key = "{}{}/{}.{}".format(KeyPrefix,Type,Checksum,Type)
else:
    Key = "{}{}/{}.{}".format(KeyPrefix,"unknown","unknown")

Size = os.path.getsize(local_file)

parts = [
    ('key',(None,Key)),('acl',ACL)),('policy',Policy)),('signature',Signature)),('GoogleAccessId',GoogleAccessId)),('Cache-control',CacheControl)),('Content-Type',MimeTypeOfFile)),('file',(os.path.basename(local_file),open(local_file,'rb'),MimeTypeOfFile))
]

heads = {"ngsw-bypass": "1","x-client-data": "somelongencodedstring"}

response = requests.post(BaseURL,files=parts,headers=heads)
  • result由另一个提供所有上传内容的请求返回 此Google Cloud Service所需的详细信息(这是BaseURL所在的位置) 点)。
  • local_file就是我要上传的文件的名称。
  • somelongencodedstring是从外观上看是一种API密钥 从Firefox记录的提取请求中复制了它,并具有 在这里将其匿名化。

我希望做的是将最后一行(以及我需要用其备份的其他内容)替换为具有用于渲染进度条的回调的东西。

我可以看到Python中的wget实现使用了urllib.request.FancyURLopener及其retrieve方法,该方法的参数接受作为回调的函数。

我注定要深入研究urllib的内部吗?还是request.post可以为我做点什么?还是有其他可行的解决方案可以滑入request.post的位置?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)