Python 如何使用post请求发送BytesIO

Python 如何使用post请求发送BytesIO,python,python-requests,msgpack,bytesio,Python,Python Requests,Msgpack,Bytesio,我试图使用请求post将msgpack编码的值发送到服务器,该请求发送到一个insert rest端点,该端点将序列化字节流作为输入。但似乎这些值没有正确地到达那里,因为我没有看到在表中插入任何值。我以前从未尝试过,请原谅我的无知。以下是我正在做的: buf = io.BytesIO() for rows in dataframe: buf.write(msgpack.packb(rows)) response = requests.post(url, data=buf, ver

我试图使用请求post将msgpack编码的值发送到服务器,该请求发送到一个insert rest端点,该端点将序列化字节流作为输入。但似乎这些值没有正确地到达那里,因为我没有看到在表中插入任何值。我以前从未尝试过,请原谅我的无知。以下是我正在做的:

buf = io.BytesIO()
for rows in dataframe:
    buf.write(msgpack.packb(rows))
    response = requests.post(url, data=buf, verify=False)
    try:
        response.raise_for_status()
    except requests.exceptions.HTTPError as err:
        print('Error fetching response using requests')

每当我写入缓冲区时,指针总是指向缓冲区的末尾,并等待新的写入。因此,当我传递
data=buf
时,将进行一个没有值的插入。解决方案是执行
buf.seek(0)
,然后将
data=buf
作为参数传递,或者干脆将
data=buf.seek(0)

因此,以下工作:

for rows in dataframe:
    buf = io.BytesIO()
    buf.write(msgpack.packb(rows))
    buf.seek(0)
    response = requests.post(url, data=buf, verify=False)
    try:
        response.raise_for_status()
    except requests.exceptions.HTTPError as err:
        print('Error fetching response using requests')

扩展您的答案,建议使用with块来修复异常情况下的内存泄漏

for rows in dataframe:
    with io.BytesIO(msgpack.packb(rows)) as buf:
        buf.seek(0)
        response = requests.post(url, data=buf, verify=False)
    try:
        response.raise_for_status()
    except requests.exceptions.HTTPError as err:
        print('Error fetching response using requests')

您还可以在创建
BytesIO
对象时添加初始数据,这样就不必调用
seek

>>> import io
>>> buf = io.BytesIO(b"test")
>>> buf.tell()
0
>>> buf.read()
b'test'
>>> buf.tell()
4

如果我没有弄错的话,数据需要是一个合适的数据流,才能通过requests.post进行传输。您可能需要将生成器函数写入buf,并将此生成器传递给requests.post。在这种情况下甚至可能不需要buf。buf.seek(0)是一种方法,因为buf总是指向缓冲区的末尾。我还发现我必须序列化每个值,而不是dict列表,这就是插入失败的原因。啊。我明白了:)所以,我可以简单地做data=buf然后:)很酷:)我喜欢这个。但在这种情况下,我们还必须这样做吗?