【问题标题】:header to send chunked binary in Pyramid在 Pyramid 中发送分块二进制文件的标头
【发布时间】:2012-08-02 05:57:06
【问题描述】:

我有一个名为 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,我也不确定我返回响应的方式是否会起作用,因为它不会在返回后结束响应吗?

【问题讨论】:

    标签: python streaming pyramid


    【解决方案1】:

    你是对的,你不能从一个视图返回多个响应......或者实际上,通常在一个循环中从一个函数发出多个返回 - 第一个 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

    【讨论】:

    • 如果您上面的代码自动处理字节流,那么这就是我正在寻找的。我会玩它,谢谢
    • 谢尔盖:谢谢它的工作,但我面临另一个问题。如果整个 mp3 已经被读取并存储在变量中怎么办,我是否只需创建和迭代器并将字节分成块并使用 yiel 返回它?
    • 是的,可以。或者使用 StringIO 将变量转换为类似文件的对象并将其分配给 Response.body_file。尽管我不确定上述方法与仅将变量分配给 Request.body 相比会有什么不同。我的意思是,你不需要在服务器上做任何特别的事情来让客户端在文件得到一小部分后立即播放/显示文件——这就是 WWW 从一开始就工作的方式。您只需要在提供它们之前避免将整个大文件读入内存,这就是 body_file 和 app_iter 的用途。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-24
    • 1970-01-01
    • 2011-04-13
    • 2013-12-07
    • 2010-12-20
    • 2014-03-31
    相关资源
    最近更新 更多