Sanic response file_stream() 函式用法和示例

veelion發表於2019-03-23

response.file_stream() 功能是:Sanic 返回檔案流給瀏覽器。這個函式和file()都是返回檔案,但是它的不同支出是邊讀邊返回,每次返回一定大小的資料,而file()是一次性讀完整個檔案再返回給瀏覽器。很明顯,如果檔案很大時,檔案流可以大大節省伺服器的記憶體。

Sanic response.file_stream() 函式

response.file_stream() 語法

async def file_stream(
    location,
    status=200,
    chunk_size=4096,
    mime_type=None,
    headers=None,
    filename=None,
    _range=None,
):

response.file_stream() 引數

  • location:響應要返回的檔案路徑;
  • status:預設 http 狀態碼200,正常返回不要修改;
  • chunk_size:每次讀取檔案資料的大小;
  • mime_type: 返回檔案的格式;
  • headers:自定義 http 響應頭;
  • filename:如果傳值則寫入響應頭headers的Content-Disposition
  • _range:指定檔案的某一部分;

這裡面,location是必需的引數;
可以透過傳入headers來自定義響應頭;
如果沒有傳入mime_type引數,其內部會使用模組mimetypesmimetypes.guess_type()函式透過filename來獲得;
_range物件需要有四個屬性:start, end, size, total來描述擷取檔案中的某一部分。

response.file_stream() 返回值

返回一個StreamingHTTPResponse類的例項。

response.file_stream() 例子

from sanic import Sanic
from sanic import response


app = Sanic()


@app.route('/file_stream')
async def large_file(request):
    return await response.file_stream(
        './big_file.jpg',
        headers={'X-Serverd-By': 'YuanRenXue Python'}
    )


if __name__ == '__main__':
    app.run(host='127.0.0.1', port=8888)

透過echo建立一個假的jpg檔案,其內容為“Welcom to 猿人學Python”,再透過curl來檢視file_stream響應:

echo "Welcom to 猿人學Python" > ./big_file.jpg
curl -i http://127.0.0.1:8888/file_stream

結果如下,可以看到我們自定義的headersX-Serverd-By: YuanRenXue Python


HTTP/1.1 200 OK
Keep-Alive: 5
X-Serverd-By: YuanRenXue Python
Transfer-Encoding: chunked
Content-Type: image/jpeg

Welcom to 猿人學Python

下面是file()響應的結果:

HTTP/1.1 200 OK
Connection: keep-alive
Keep-Alive: 5
X-Serverd-By: YuanRenXue Python
Content-Length: 10
Content-Type: image/jpeg

Welcom to 猿人學Python

對比一下兩者的響應頭headers,注意file_stream()多了Transfer-Encoding,卻少了Content-Length。這是因為,以流的形式每次只返回一個chunk,無法知道整個檔案的大小。

猿人學banner宣傳圖

我的公眾號:猿人學 Python 上會分享更多心得體會,敬請關注。

***版權申明:若沒有特殊說明,文章皆是猿人學 yuanrenxue.com 原創,沒有猿人學授權,請勿以任何形式轉載。***

相關文章