gpt4 book ai didi

python - 如何将 POST 数据流式传输到 Python 请求中?

转载 作者:数据小太阳 更新时间:2023-10-29 01:55:52 26 4
gpt4 key购买 nike

我正在使用 Python requests 库发送 POST 请求。生成 POST 数据的程序部分可以写入到任意类似文件的对象(输出流)。

如何使这两个部分适合?

我原以为 requests 会为这个用例提供一个流接口(interface),但它似乎没有。它只接受一个类似文件的对象作为 data 参数,它可以从中读取。它不提供我可以写入的类文件对象。

这是 Python HTTP 库的基本问题吗?

目前的想法:

看来最简单的解决方案是fork() 并让请求库通过管道 与POST 数据生成器通信。

有没有更好的办法?

或者,我可以尝试使 POST 数据生成器复杂化。但是,它正在解析一个 XML 流(来自标准输入)并生成一个新的 XML 流以用作 POST 数据。然后我遇到了同样的问题:XML 序列化程序库想要写入 到类文件对象中,我不知道 XML 序列化程序提供类文件对象的任何可能性其他人可以阅读

我还知道最干净、经典的解决方案是协同程序,它在 Python 中通过生成器 (yield) 提供了一些可用的方法。 POST 数据可以通过 (yield) 而不是类似文件的对象进行流式传输,并使用拉式解析器。

但是,是否可以让 requests 接受 POST 数据的迭代器?是否有可以轻松与 yield 结合使用的 XML 序列化程序?

或者,是否有任何包装器对象将写入类文件对象转换为生成器,和/或提供包装迭代器的类文件对象?

最佳答案

request 确实将迭代器或生成器作为 data 参数,详情在 Chunk-Encoded Requests 中描述。 .在这种情况下,传输编码需要分块,因为事先不知道数据大小。

这是一个使用 queue.Queue 的非常简单的示例并且可以用作类似文件的对象来编写:

import requests
import queue
import threading

class WriteableQueue(queue.Queue):

def write(self, data):
# An empty string would be interpreted as EOF by the receiving server
if data:
self.put(data)

def __iter__(self):
return iter(self.get, None)

def close(self):
self.put(None)

# quesize can be limited in case producing is faster then streaming
q = WriteableQueue(100)

def post_request(iterable):
r = requests.post("http://httpbin.org/post", data=iterable)
print(r.text)

threading.Thread(target=post_request, args=(q,)).start()

# pass the queue to the serializer that writes to it ...
q.write(b'1...')
q.write(b'2...')

# closing ends the request
q.close()

关于python - 如何将 POST 数据流式传输到 Python 请求中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40015869/

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