2

我有一个名为 dummy 的视图,我想从我的服务器流式传输 mp3 并将其流式传输到一个<audio src="/stream">标签,以便客户端可以立即开始播放文件而无需等待整个文件。

def dummy(request):
    headers = {
        'Content-Transfer-Encoding': 'binary',
        'Content-Type': 'audio/mpeg',
        'Transfer-Encoding': 'chunked',
        'Connection': 'keep-alive',
        'Cache-Control': 'no-cache'
    }
    with open('songer.mp3') as handle:
        while True:
            bytes = handle.read(CHUNK)
            if not bytes:
                break
            return Response(bytes, headers=headers)

但我是ERR_INVALID_CHUNKED_ENCODING从 chrome 获得的,我也不确定我返回响应的方式是否会起作用,因为一旦它到达返回,它不会结束响应吗?

4

1 回答 1

5

你是对的,你不能从一个视图返回多个响应......或者实际上,通常在一个循环中从一个函数发出多个返回 - 第一个 return 语句将终止该函数。

看看Response.body_fileResponse.app_iter属性。

response.app_iter: 将产生响应内容的可迭代对象(例如列表或生成器)。这也可以作为 response.body(一个字符串)、response.unicode_body(一个 unicode 对象,由 response.charset 通知)和 response.body_file(一个类似文件的对象;写入它附加到 app_iter)来访问

body_file可用于写入正文的类似文件的对象。如果您传入一个列表 app_iter,则该 app_iter 将被写入修改。

http://docs.pylonsproject.org/projects/pyramid/en/latest/api/response.html

如果你做类似的事情

request.response.body_file = open('songer.mp3')
# set any headers here
return response

该文件将从磁盘读取并立即发送到客户端,而无需等待整个文件。我不确定这里是否需要分块传输编码。

WebOb 文档有一个更复杂的文件服务应用程序示例,它可以有效地处理 Range 请求:http ://docs.webob.org/en/latest/file-example.html

于 2012-08-01T21:46:12.677 回答