标题在Pyramid中发送chunked二进制文件

时间:2012-08-01 17:12:20

标签: python streaming pyramid

我有一个名为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)

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

1 个答案:

答案 0 :(得分: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文档中有一个更复杂的文件服务应用程序示例,它可以有效地处理范围请求:http://docs.webob.org/en/latest/file-example.html