Python Web框架能够进行分块传输编码吗?

时间:2013-04-28 22:08:20

标签: python http chunked-encoding

我正在使用Python开发一个Web应用程序,其中一个用例是供用户使用:

  • 通过HTTP POST和

  • 上传大文件
  • 同时下载并显示响应,该响应是类似大小的文件的已处理版本。

客户端是我们用C ++开发的,但我想使用HTTP。服务器不需要整个文件开始生成响应,它可以在前250KB左右到达时开始处理数据。上传开始和第一部分响应之间的延迟应该尽可能低(例如,在原始套接字可能达到的100毫秒内)

据推测,使用分块传输编码而不是多个小型HTTP请求是理想的吗?总请求/响应的长度不能提前知道,但我想它可以分成多个已知大小的请求/响应,是否有一个Web服务器可以愉快地流(而不是缓冲+传递)那些块因为他们正在上传?

我听说使用分块传输编码很好,但我更愿意使用更传统的Web框架,特别是对于我的应用程序的其余部分(在这个用例之外不需要任何东西)像这样的幻想。)

3 个答案:

答案 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接口。