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

veelion發表於2019-03-23

response.stream() 功能:Sanic 返回流資料給瀏覽器。流資料的意思就是,不是一次性把所有資料返回,而是一部分一部分地返回。

Sanic response.stream() 函式

response.stream() 語法

def stream(
    streaming_fn,
    status=200,
    headers=None,
    content_type="text/plain; charset=utf-8",
):

response.stream() 引數

  • streaming_fn:用於流響應寫資料的協程函式;
  • status:預設 http 狀態碼200,正常返回不要修改;
  • headers:自定義 http 響應頭;
  • content_type:純文字的content type,按需修改;

這裡面,streaming_fn是必需的引數,可以透過傳入headers來自定義響應頭,其它引數不要修改。

response.stream() 返回值

返回一個StreamingHTTPResponse類的例項。

response.stream() 例子

import asyncio
import time
from sanic import Sanic
from sanic import response


app = Sanic()


@app.route('/stream')
async def streaming(request):
    async def streaming_fn(response):
        await response.write('Welcom to @{}\n'.format(time.strftime('%H:%M:%S')))
        await asyncio.sleep(3)
        await response.write('猿人學Python @{}\n'.format(time.strftime('%H:%M:%S')))
    return response.stream(
        streaming_fn,
        headers={'X-Serverd-By': 'YuanRenXue Python'}
    )


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

透過curl來檢視stream響應:

curl -i http://127.0.0.1:8888/stream

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


HTTP/1.1 200 OK
Keep-Alive: 5
X-Serverd-By: YuanRenXue Python
Transfer-Encoding: chunked
Content-Type: text/plain; charset=utf-8

Welcom to @12:05:21
猿人學Python @12:05:24

為了演示流資料的“流性”,也就是一點一點的返回資料,我們在兩次非同步寫操作之間加了一個停頓3秒的操作。透過curl或瀏覽器檢視結果時,可以看到第一個寫操作是在12:05:21這個時間發生,3秒以後才會看到第二次寫操作的內容。兩者寫入的時間戳正好相差3秒。

猿人學banner宣傳圖

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

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

相關文章