能够支持分块传输编码的Python Web框架是什么?

3

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

  • 通过HTTP POST上传大文件,并

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

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

理论上最好使用分块传输编码而不是多个小的HTTP请求?总请求/响应的长度事先无法确定,但我想它可以分成多个已知大小的请求/响应,是否有Web服务器可以在上传时流式传输(而不是缓冲+传递)这些块?

我听说twisted对分块传输编码很好,但如果可能的话,我更喜欢使用更传统的Web框架,特别是对于我的应用程序的其余部分(除了这种用例外,不需要像这样的高级功能)。


为了澄清,以防万一,我想要一个Web框架,使得POST处理程序在服务器下载整个请求之前就可以被调用。 - user1478842
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块使用,但并非必须这样做。


我该如何将这个与像Django、Flask、Pyramid等更高级别的框架集成? - user1478842
1
@user1478842:这些框架大多都有WSGI部署选项。如果您可以访问它们的WSGI应用程序对象,那么在自定义的WSGI应用程序对象中,您可以确定是否要自己处理它还是将其传递下去。如果您想要传递它,Python 3有一个非常好用的语法:yield from。使用它,您可以像这样传递:yield from other_application(environ, start_response) - icktoofay
对于某些框架,如果该框架本身足够低级,则甚至可以直接执行此操作,而无需包装WSGI应用程序。例如,您可以使用Werkzeug执行此操作,Flask就是基于Werkzeug开发的(这让我相信Flask可能以某种方式支持它)。您提到的其他框架也可能支持它,但我从未尝试将它们与其他原始WSGI应用程序集成。 - icktoofay

0

0

我喜欢web.py的简单性。它可以进行分块传输编码。

http://webpy.org/cookbook/streaming_large_files

但是...

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

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


有趣,我很惊讶它不接受分块POST数据。我注意到Django似乎允许您从传入的上传中提取数据(请参见https://docs.djangoproject.com/en/dev/topics/http/file-uploads/),但我认为实际发生的是它在调用处理程序之前等待整个POST请求到达,并且“chunks”循环仅是为了使本地I/O运行更顺畅。 - user1478842

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接