我正在使用Python开发一个Web应用程序,其中一个用例是供用户使用:
通过HTTP POST和
同时下载并显示响应,该响应是类似大小的文件的已处理版本。
客户端是我们用C ++开发的,但我想使用HTTP。服务器不需要整个文件开始生成响应,它可以在前250KB左右到达时开始处理数据。上传开始和第一部分响应之间的延迟应该尽可能低(例如,在原始套接字可能达到的100毫秒内)
据推测,使用分块传输编码而不是多个小型HTTP请求是理想的吗?总请求/响应的长度不能提前知道,但我想它可以分成多个已知大小的请求/响应,是否有一个Web服务器可以愉快地流(而不是缓冲+传递)那些块因为他们正在上传?
我听说使用分块传输编码很好,但我更愿意使用更传统的Web框架,特别是对于我的应用程序的其余部分(在这个用例之外不需要任何东西)像这样的幻想。)
答案 0 :(得分:1)
WSGI支持这一点。在这里,我们将回应他们发送给我们的任何内容:
def application(environ, start_response):
content_type = environ.get('CONTENT_TYPE', 'text/plain')
headers = [('Content-Type', content_type)]
if 'CONTENT_LENGTH' in environ:
headers.append(('Content-Length', environ['CONTENT_LENGTH']))
start_response('200 OK', headers)
input = environ.get('wsgi.input')
if input is None:
yield ''
return
while True:
datum = input.read(4096) # or so
if not datum:
return
yield datum
Web服务器可能会选择将每个yield
用作Transfer-Encoding: chunked
块,但不需要它们。
答案 1 :(得分:0)
查看:https://github.com/jakobadam/plupload-backends,其中包含plupload的Python WSGI实现。
它通过(IIRC)将多个大型请求合并到一个文件中,该文件可能使用或不使用分块传输编码。
答案 2 :(得分:0)
为了简单起见,我喜欢web.py.它可以进行分块传输编码。
http://webpy.org/cookbook/streaming_large_files
但是......
这仅适用于在多个部分中提供响应。如果您想尝试从客户端将数据“流式”传输到服务器,则需要客户端执行多个较小的POST。并且您无法通过单个响应处理来自不同POST的多个响应...可能显然?
这是一个比起初看起来更难解决的问题,但我仍然建议使用web.py或类似的轻量级框架构建ReSTful接口。