【问题标题】:How to send BytesIO using requests post如何使用请求发布发送 BytesIO
【发布时间】:2021-05-03 19:52:51
【问题描述】:

我正在尝试使用发送到插入休息端点的请求将 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')

【问题讨论】:

  • 如果我没记错的话,数据需要是可迭代的,才能由 requests.post 流式传输。您可能需要改为将生成器函数写入 buf 并将此生成器传递给 requests.post。在这种情况下,甚至可能不需要 buf。
  • buf.seek(0) 是这样做的方式,因为 buf 总是指向缓冲区的末尾。而且我还发现我必须序列化每个值而不是字典列表,这就是插入失败的原因。

标签: python python-requests msgpack bytesio


【解决方案1】:

每当我写入缓冲区时,指针将始终指向缓冲区的末尾并等待新的写入。所以,当我通过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】:

    建议使用 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')
    

    【讨论】:

    • 很酷 :) 我喜欢这个。但是在这种情况下我们还需要寻找吗?
    【解决方案3】:

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

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

    【讨论】:

    • 啊。我明白了:) 所以,我可以简单地做 data=buf :)
    猜你喜欢
    • 1970-01-01
    • 2019-10-28
    • 2014-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多