使用Python Requests进行流式上传

2 投票
2 回答
906 浏览
提问于 2025-04-18 12:57

我想用HTTP Post来传输一段“无限”的(也就是连续的)数据。简单来说,我想先发送一个POST请求的头部,然后再传输内容(内容的长度是未知的)。我查了一下http://docs.python-requests.org/en/latest/user/advanced/,看起来这个库是可以做到的。我有一个问题,文档里说“要进行流式上传,只需提供一个类似文件的对象作为请求体”。这里的“类似文件”对象是什么意思呢?我想要传输的数据来自一个传感器。我该如何实现一个“类似文件”的对象,让它能从传感器读取数据并传递给调用者呢?

抱歉我对这些不太了解,我正在慢慢学习python(也就是边学边摸索。嗯……看起来像条蛇,感觉滑滑的。尽量避免碰到蛇头…… :-))。

非常感谢你的帮助。

Ranga.

2 个回答

0

文件类对象就是一种有“读取”功能的方法的对象,这个方法可以接受一个大小参数,然后返回下一段数据的二进制数据缓冲区。

一个很常见的例子就是文件对象,如果你想从文件系统中读取数据,就可以用它。

另一个常见的情况是 StringIO 类,它可以读写一个缓冲区。

在你的情况下,你需要自己实现一个“文件类对象”,这个对象的功能就是从传感器中读取数据。

class Sensor(object):
    def __init__(self, sensor_thing)
        self.sensor_thing = sensor_thing

    def read(self, size):
        return self.convert_to_binary(self.sensor_thing.read_from_sensor())

    def convert_to_binary(self, sensor_data)
        ....
1

我想给你一个答案,这样你就可以关闭你的问题了:

听起来你真正想要的是 Python 的 Websockets。简单来说,你首先发一个 HTTP 请求来升级连接到 Websocket,完成握手后,你就可以双向传输数据了。Python 让这个过程变得很简单,比如说

from flask import Flask 

from flask_sockets import Sockets

app = Flask(__name__) 
sockets = Sockets(app)

@sockets.route('/echo') 
def echo_socket(ws): 
    while True: 
        message = ws.receive() 
        ws.send(message)

@app.route('/') 
def hello(): 
    return 'Hello World!'

Websockets 支持全双工通信,也就是说可以同时发送和接收数据,但你似乎只对服务器到客户端的部分感兴趣。在这种情况下,你可以直接使用 ws.send() 来发送数据。我不确定这是否正是你想要的,但这应该能提供一个解决方案。

撰写回答