gpt4 book ai didi

python - 使用 Python urllib2,如何在 GET 和 POST 之间流式传输?

转载 作者:行者123 更新时间:2023-11-28 16:36:57 24 4
gpt4 key购买 nike

我想编写代码将文件从一个站点传输到另一个站点。这可能是一个大文件,我想在不创建本地临时文件的情况下执行此操作。

我在 Python 中看到了使用 mmap 上传大文件的技巧:“HTTP 发布一个带有流的大文件”,但我真正需要的是一种将 GET 的响应链接到创建 POST 的方法。

以前有人做过吗?

最佳答案

你不能,或者至少不应该。

urllib2 请求对象无法动态地将数据流式传输到它们中,就是这样。另一方面,响应对象是类文件对象,因此理论上您可以read(8192) 而不是 read(),但对于大多数协议(protocol)- 包括 HTTP - 它会经常或总是将整个响应读入内存,并从其缓冲区中为您的 read(8192) 调用提供服务,使其毫无意义。因此,您必须拦截请求,从中窃取套接字,然后手动处理它,此时 urllib2 对您的阻碍大于帮助。

urllib2 让一些事情变得简单,一些事情比他们应该做的更难,还有一些事情几乎不可能;当它不能让事情变得简单时,请停止使用它。


一种解决方案是使用更高级别的第三方库。例如,requests让你走到一半(这使得从响应中流式传输变得非常容易,但只能在有限的情况下流式传输到响应中),以及 requests-toolbelt让您完成剩下的工作(它添加了各种流式上传方式)。


另一种解决方案是使用较低级别的库。在这里,您甚至不必离开标准库。 httplib迫使您一点一点地考虑发送和接收事物,但这正是您想要的。在 get 请求上,您可以只调用 connectrequest,然后在响应对象上重复调用 read(8192)。在 post 请求中,调用 connectputrequestputheaderendheaders,然后重复 send 来自 get 请求的每个缓冲区,然后在完成时 getresponse

事实上,在 Python 3.2+ 的 http.client(相当于 2.x 的 httplib)中,HTTPClient.request 并没有不必是字符串,它可以是任何可迭代的 或任何具有 readfileno 方法 的类文件对象…其中包括一个响应目的。所以,就这么简单:

import http.client

getconn = httplib.HTTPConnection('www.example.com')
getconn.request('GET', 'http://www.example.com/spam')
getresp = getconn.getresponse()

getconn = httplib.HTTPConnection('www.example.com')
getconn.request('POST', 'http://www.example.com/eggs', body=getresp)
getresp = getconn.getresponse()

… 当然,除了您可能想要制作适当的 header (您实际上可以使用 urllib.request,即 urllib2 的 3.x 版本来构建一个 Request 对象而不是发送它...),并使用 urlparse 将主机和端口从 URL 中拉出,而不是对它们进行硬编码,并且您想用尽或至少检查来自 POST 请求的响应,等等。但这显示了困难的部分,而且并不难。

不幸的是,我认为这在 2.x 中不起作用。


最后,如果您熟悉 libcurl,它至少有三个包装器(包括源代码分发附带的一个)。我不确定是将 libcurl 称为比 urllib2 更高级别还是更低级别,它有点复杂。 :)

关于python - 使用 Python urllib2,如何在 GET 和 POST 之间流式传输?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24900004/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com