3

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

  • 通过 HTTP POST 上传一个大文件,然后

  • 同时下载并显示一个响应,这是一个类似大小的文件的处理版本。

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

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

我听说扭曲的分块传输编码很好,但如果可能的话,我更喜欢使用更传统的 Web 框架,特别是对于我的应用程序的其余部分(在这个用例之外,不需要像这样的任何花哨的东西)。

4

3 回答 3

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块使用,尽管它们不是必需的。

于 2013-04-28T22:43:27.293 回答
0

看看:https ://github.com/jakobadam/plupload-backends,它有一个用于plupload的 Python WSGI 实现。

它由(IIRC)通过将多个大型请求组合到一个文件中来工作,该文件可能使用也可能不使用分块传输编码。

于 2013-04-28T22:39:48.423 回答
0

为了简单起见,我喜欢 web.py。它可以进行分块传输编码。

http://webpy.org/cookbook/streaming_large_files

但...

这仅适用于在多个部分中提供响应。如果您想尝试将数据从客户端“流式传输”到服务器,则需要客户端执行多个较小的 POST。而且您不能通过单个响应来处理来自不同 POST 的多个响应......可能很明显?

这是一个比起初看起来更难解决的问题,但我仍然建议使用 web.py 或一些类似的轻量级框架构建一个 ReSTful 接口。

于 2013-04-28T22:44:53.240 回答