Python 在金字塔中发送分块二进制文件的标头

Python 在金字塔中发送分块二进制文件的标头,python,streaming,pyramid,Python,Streaming,Pyramid,我有一个名为dummy的视图,我想从我的服务器将mp3流式传输到标记,这样客户端就可以立即开始播放该文件,而无需等待整个文件 def dummy(request): headers = { 'Content-Transfer-Encoding': 'binary', 'Content-Type': 'audio/mpeg', 'Transfer-Encoding': 'chunked', 'Connection': 'kee

我有一个名为dummy的视图,我想从我的服务器将mp3流式传输到
标记,这样客户端就可以立即开始播放该文件,而无需等待整个文件

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\u INVALID\u CHUNKED\u ENCODING
,而且我也不确定返回响应的方式是否有效,因为它不会在返回时结束响应吗?

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

查看
Response.body\u文件
Response.app\u iter
属性

响应。应用程序: 将 生成响应的内容。这也可以通过以下方式访问: response.body(字符串)、response.unicode_body(unicode对象、, 由response.charset)和response.body_文件(类似 对象;向其写入附加到应用程序(iter)

正文\u文件一种类似文件的对象,可用于写入正文。如果 您传入了一个应用程序列表,该应用程序将由 写

如果你这样做

request.response.body_file = open('songer.mp3')
# set any headers here
return response
该文件将从磁盘读取并立即发送到客户端,而无需等待整个文件。我不确定这里是否需要分块传输编码


WebOb文档中有一个更复杂的文件服务应用程序示例,它可以有效地处理范围请求:

如果上面的代码自动处理字节流,那么这就是我要寻找的。谢谢,我会好好玩玩的。谢了。谢了,这很管用,但我还面临着另一个问题。如果整个mp3已经被读取并存储在一个变量中,我是否只需要创建和迭代器并将字节分割成块,然后使用yiel返回它呢?是的,这会起作用。或者使用StringIO将变量转换为类似文件的对象,并将其分配给Response.body_文件。虽然我不确定上述方法与将变量分配给Request.body相比会有什么不同。我的意思是,您不需要在服务器上做什么特殊的事情,就可以让客户机在获得文件的一小部分后立即播放/显示该文件-这就是WWW从一开始的工作方式。您只需要在提供服务之前避免将整个大文件读入内存,这就是body_file和app_iter的用途。