我有一个名为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
,我也不确定我返回响应的方式是否会起作用,因为一旦它返回,它不会结束响应吗?
答案 0 :(得分:5)
你是对的,你不能从视图中返回多个响应......或者,实际上,通常会从循环中的函数发出多个返回 - 第一个return语句将终止该函数。
查看Response.body_file
和Response.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