【问题标题】:Python web framework capable of chunked transfer encoding? [closed]能够分块传输编码的 Python Web 框架? [关闭]
【发布时间】:2013-04-28 22:08:20
【问题描述】:

我正在用 Python 开发一个网络应用程序,其中一个用例是让用户:

  • 通过 HTTP POST 上传大文件和

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

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

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

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

【问题讨论】:

  • 澄清一下,以防万一,我想要一个 Web 框架,它可以在服务器下载整个请求之前调用 POST 处理程序。

标签: python http chunked-encoding


【解决方案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 块,尽管它们不是必需的。

【讨论】:

  • 如何将其与 django、flask、pyramid 等更高级别的框架集成?
  • @user1478842:大多数框架都有 WSGI 部署选项。如果您可以访问他们的 WSGI 应用程序对象,那么在您的自定义 WSGI 应用程序对象中,您可以确定您是想自己处理它还是传递它。如果你想传递它,Python 3 有一些你可以使用的简洁语法:yield from。有了它,你会像yield from other_application(environ, start_response) 一样传递下去。
  • @user1478842:对于某些框架,如果框架本身足够低级,您甚至可以直接执行此操作而无需包装 WSGI 应用程序。例如,您可以使用 Flask 所基于的 Werkzeug 来做到这一点(这让我相信 Flask 可能会以某种方式支持它)。您提到的其他框架可能也支持它,但我从未尝试将它们与其他原始 WSGI 应用程序集成。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    http://webpy.org/cookbook/streaming_large_files

    但是……

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

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

    【讨论】:

    • 有趣的是,我很惊讶它不接受分块的 POST 数据。我注意到 django 似乎允许您从传入的上传中提取数据(请参阅docs.djangoproject.com/en/dev/topics/http/file-uploads),但我认为实际发生的情况是它在调用处理程序之前等待整个 POST 请求到达,并且“块” ' 循环只是为了让本地 I/O 运行更顺畅。
    猜你喜欢
    • 1970-01-01
    • 2013-02-13
    • 1970-01-01
    • 2023-03-16
    • 2014-11-24
    • 1970-01-01
    • 2010-09-06
    • 1970-01-01
    • 2012-11-02
    相关资源
    最近更新 更多