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

2024-03-29 06:22:51 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我怎样才能使这两个部分合身呢?在

我本以为requests为这个用例提供了一个流接口,但它似乎没有。它只接受一个类似文件的对象作为data参数,它从该对象中读取。它没有提供一个类似文件的对象,我可以将其写入。在

这是pythonhttp库的一个基本问题吗?在

目前的想法:

似乎最简单的解决方案是fork(),并让请求库通过管道与POST data producer通信。在

有更好的方法吗?在

或者,我可以尝试使POST-data生成器复杂化。但是,它正在解析一个XML流(来自stdin)并生成一个新的XML流用作POST数据。反过来,我也有同样的问题:XML序列化程序库希望写入一个类似文件的对象,我不知道XML序列化程序是否提供了一个类似文件的对象,其他人可以从中读取。在

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

但是,是否可以使requests接受POST数据的迭代器?是否有一个XML序列化程序可以方便地与yield结合使用?在

或者,是否有任何包装器对象可以将写入转换为类似文件的对象,并/或提供包装迭代器的类似文件的对象?在


Tags: 文件数据对象程序data参数序列化xml
2条回答

将需要数据接收器的推送接口的数据生产者与需要其数据源的拉接口的数据使用者连接的唯一方法是通过中间缓冲区。这样的系统只能通过“并行”地运行生产者和消费者来操作——生产者填充缓冲区,消费者从中读取数据,必要时每个缓冲区都被挂起。这种并行性可以用协同多任务来模拟,其中,当缓冲区满时,生产者将控制权交给消费者,当缓冲区变空时,消费者将控制权返回给生产者。通过使用生成器方法,您将为您的案例构建一个定制的协作多任务解决方案,与简单的基于管道的方法相比,该解决方案很难简单,在这种方法中,生产商和消费者的时间安排完全由操作系统负责。在

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

下面是一个非常简单的示例,它使用^{},可以用作类似于文件的对象进行写入:

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()

相关问题 更多 >