使用Python Requests进行流式上传
我想用HTTP Post来传输一段“无限”的(也就是连续的)数据。简单来说,我想先发送一个POST请求的头部,然后再传输内容(内容的长度是未知的)。我查了一下http://docs.python-requests.org/en/latest/user/advanced/,看起来这个库是可以做到的。我有一个问题,文档里说“要进行流式上传,只需提供一个类似文件的对象作为请求体”。这里的“类似文件”对象是什么意思呢?我想要传输的数据来自一个传感器。我该如何实现一个“类似文件”的对象,让它能从传感器读取数据并传递给调用者呢?
抱歉我对这些不太了解,我正在慢慢学习python(也就是边学边摸索。嗯……看起来像条蛇,感觉滑滑的。尽量避免碰到蛇头…… :-))。
非常感谢你的帮助。
Ranga.
2 个回答
文件类对象就是一种有“读取”功能的方法的对象,这个方法可以接受一个大小参数,然后返回下一段数据的二进制数据缓冲区。
一个很常见的例子就是文件对象,如果你想从文件系统中读取数据,就可以用它。
另一个常见的情况是 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)
....
我想给你一个答案,这样你就可以关闭你的问题了:
听起来你真正想要的是 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()
来发送数据。我不确定这是否正是你想要的,但这应该能提供一个解决方案。