如何使用请求帖子发送 BytesIO

时间:2021-05-03 19:52:51

标签: python python-requests msgpack bytesio

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

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

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

每当我写入缓冲区时,指针将始终指向缓冲区的末尾并等待新的写入。因此,当我传递 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')

答案 2 :(得分:0)

扩展您的答案,建议使用 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')