【发布时间】:2017-02-22 06:35:40
【问题描述】:
我正在使用 Python requests 库发送 POST 请求。生成 POST 数据的程序部分可以写入到任意文件类对象(输出流)中。
我怎样才能使这两个部分适合?
我原以为requests 会为此用例提供流接口,但似乎没有。它只接受一个类似文件的对象作为data 参数,它从中读取。它没有提供我可以写入的类似文件的对象。
这是 Python HTTP 库的基本问题吗?
目前的想法:
似乎最简单的解决方案是fork() 并让请求库通过管道与 POST 数据生产者进行通信。
有没有更好的办法?
或者,我可以尝试使 POST 数据生成器复杂化。但是,它正在解析一个 XML 流(来自标准输入)并生成一个新的 XML 流以用作 POST 数据。然后我反过来遇到同样的问题:XML 序列化程序库想要 write 到类似文件的对象中,我不知道 XML 序列化程序提供类似文件的对象的任何可能性其他人可以阅读。
我也知道最干净、最经典的解决方案是协程,它在 Python 中通过生成器 (yield) 可以使用。 POST 数据可以通过 (yield) 而不是类似文件的对象进行流式传输,并使用拉式解析器。
但是,可以让requests 接受 POST 数据的迭代器吗?是否有一个 XML 序列化器可以很容易地与 yield 结合使用?
或者,是否有任何包装器对象将写入到类似文件的对象变成生成器,和/或提供包装迭代器的类似文件的对象?
【问题讨论】:
-
为什么
requests必须提供“一个可以写入的类文件对象”?它被设计为在前台工作而不是后台模式,因此它需要读取而不是提供描述符并被动等待输入。如果你需要它,你可以自己提供它,就像:r,w=(os.fdopen(f,mode) for f,mode in zip(os.pipe(),("rb","wb")))- 然后在不同的线程中运行这两个部分。
标签: python xml http python-requests generator