2

サーバーから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クロムから取得しています。また、応答を返す方法が機能するかどうかもわかりません。応答が返ってきたら応答を終了しないのでしょうか?

4

1 に答える 1

5

そうです、ビューから複数の応答を返すことはできません...または、実際には、通常、ループ内の関数から複数の戻り値を発行します-最初の return ステートメントは関数を終了します。

Response.body_fileResponse.app_iter属性を見てください。

response.app_iter: 応答 のコンテンツを生成する反復可能 (リストやジェネレータなど)。これは、response.body (文字列)、response.unicode_body (response.charset によって通知される Unicode オブジェクト)、および 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 に答える